Rom*_*man 16 java oracle hibernate jndi jdbc
为什么java.sql.Connection无法在下面的代码中强制转换为oracle.jdbc.OracleConnection?
我的主要目标是传递给Oracle连接新用户名并将其保存在例如'osuser'列的'SESSION'表中,因为我想跟踪数据库用户更改并将其显示在表中.
@Repository
public class AuditLogDAOImpl implements AuditLogDAO {
@PersistenceContext(unitName="myUnitName")
EntityManager em;
@Resource(name = "dataSource")
DataSource dataSource;
public void init() {
try {
Connection connection = DataSourceUtils.getConnection(dataSource);
OracleConnection oracleConnection = (OracleConnection) connection; //Here I got cast exception!
String metrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = "my_new_username";
oracleConnection.setEndToEndMetrics(metrics, (short) 0);
java.util.Properties props = new java.util.Properties();
props.put("osuser", "newValue");
oracleConnection.setClientInfo(props);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误日志:
10:42:29,251 INFO [STDOUT] org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@bcc8cb
10:42:51,701 ERROR [STDERR] java.lang.ClassCastException: $Proxy286 cannot be cast to oracle.jdbc.OracleConnection
Run Code Online (Sandbox Code Playgroud)
通常我在这种情况下有2个问题:
我通过jndi使用Oracle 11g,Hibernate(使用实体管理器),数据源.
请帮忙,谢谢!
经过一些改进后,铸造问题仍然存在.
改进:
Connection connection = DataSourceUtils.getConnection(dataSource);
connection = ((org.jboss.resource.adapter.jdbc.WrappedConnection)connection).getUnderlyingConnection();
OracleConnection oracleConnection = (OracleConnection) connection;
Run Code Online (Sandbox Code Playgroud)
错误:
java.lang.ClassCastException: $Proxy287 cannot be cast to org.jboss.resource.adapter.jdbc.WrappedConnection
Run Code Online (Sandbox Code Playgroud)
Car*_*ini 35
您正在检索的连接可能是一个包装连接.
如果您确实需要获得底层Oracle连接,则应使用:
if (connection.isWrapperFor(OracleConnection.class)){
OracleConnection oracleConnection= connection.unwrap(OracleConnection.class);
}else{
// recover, not an oracle connection
}
Run Code Online (Sandbox Code Playgroud)
这些isWrapperFor和unwrap方法从Java 1.6开始可用,并且应该由A/S连接包装器有意义地实现.
小智 4
连接池通常有一个围绕真实连接实例的包装器,这就是您的转换失败的原因。
无论如何,您所做的都是行不通的,因为仅在建立连接时才会检查属性实例中的参数。由于您的连接已经处于活动状态,因此不会改变任何内容。
您需要使用DBMS_APPLICATION_INFO.SET_CLIENT_INFO()才能更改现有连接的设置。
| 归档时间: |
|
| 查看次数: |
61373 次 |
| 最近记录: |