以下のコードで java.sql.Connection を oracle.jdbc.OracleConnection にキャストできないのはなぜですか?
私の主な目標は、Oracle接続に新しいユーザー名を渡し、DBユーザーの変更を追跡してテーブルに表示したいので、たとえば「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();
}
}
}
エラーログは次のとおりです。
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