【发布时间】:2015-07-22 08:16:48
【问题描述】:
如何访问 JBoss 上的 OraclePreparedStatement ?
我最终从 JBoss 获得了 org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6。我从中调用“getUnderlyingStatement”方法,并返回一个“OraclePreparedStatementWrapper”(Oracle 驱动程序内部类)。
我发现这个post 有一个“解决方案”,但在我们的案例中不起作用。访问这些类的内部字段“preparedStatement”会返回一个“oracle.jdbc.driver.T4CPreparedStatement”类。
我们的实际代码:
} else if (st.getClass().getName().equals ("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6")) {
try {
Class jbossWrappedSt = Class.forName("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6");
Method metodoUnwrap = jbossWrappedSt.getMethod ("getUnderlyingStatement");
Object val = metodoUnwrap.invoke (st);
Field preparedStatementField = val.getClass ().getDeclaredField ("preparedStatement");
preparedStatementField.setAccessible (true);
return ((PreparedStatement)preparedStatementField.get(val)); // Returns a "if (st.getClass().getName().equals ("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6")) {
try {
Class jbossWrappedSt = Class.forName("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6");
Method metodoUnwrap = jbossWrappedSt.getMethod ("getUnderlyingStatement");
Object val = metodoUnwrap.invoke (st);
Field preparedStatementField = val.getClass ().getDeclaredField ("preparedStatement");
preparedStatementField.setAccessible (true);
return getOraclePreparedStatement ((PreparedStatement)preparedStatementField.get(val));
} catch (Throwable e) {
throw new ConfigException ("En getOraclePreparedStatement, error al intentar acceder a la conexión Oracle del pool de conexiones JBoss", e);
}
} else { ...
【问题讨论】: