gpt4 book ai didi

java - 无法将连接转换为 oracle.jdbc.OracleConnection

转载 作者:太空狗 更新时间:2023-10-29 22:42:51 26 4
gpt4 key购买 nike

为什么不能在下面的代码中将 java.sql.Connection 转换为 oracle.jdbc.OracleConnection?

我的主要目标是将新用户名传递给 Oracle 连接并将其保存在“SESSION”表中的“osuser”列中,因为我想跟踪数据库用户更改并将其显示在表中。

@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();
}
}
}

错误日志如下:

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

通常我在这种情况下有 2 个问题:

  • 为什么从 Connection 转换到 OracleConnection 会失败,并且
  • 实现我的意图的最佳方式是什么(我的意思是在 Oracle DB 中将新用户名设置为 v$session.osuser?

我使用 Oracle 11g、Hibernate(使用实体管理器)和通过 jndi 的数据源。

请帮忙,谢谢!

编辑:

经过一些改进后转换的问题仍然存在。

改进:

Connection connection = DataSourceUtils.getConnection(dataSource);
connection = ((org.jboss.resource.adapter.jdbc.WrappedConnection)connection).getUnderlyingConnection();
OracleConnection oracleConnection = (OracleConnection) connection;

错误:

java.lang.ClassCastException: $Proxy287 cannot be cast to org.jboss.resource.adapter.jdbc.WrappedConnection

最佳答案

您正在检索的连接可能是包装连接。

如果您真的需要获取底层 Oracle 连接,您应该使用:

if (connection.isWrapperFor(OracleConnection.class)){
OracleConnection oracleConnection= connection.unwrap(OracleConnection.class);
}else{
// recover, not an oracle connection
}

isWrapperForunwrap 方法从 Java 1.6 开始可用,并且应该由 A/S 连接包装器有意义地实现。

关于java - 无法将连接转换为 oracle.jdbc.OracleConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15483356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com