【问题标题】:There is a way of get a OraclePreparedStatement insisde of a JBoss 6/7?有办法获得 JBoss 6/7 的 OraclePreparedStatement 吗?
【发布时间】: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 { ...

【问题讨论】:

    标签: java oracle jdbc jboss


    【解决方案1】:

    您可以通过以下方式联系java.sql.Connection

    Session session = entityManager.unwrap(Session.class);
    SessionFactoryImplementor sfi = (SessionFactoryImplementor) session.getSessionFactory();
    ConnectionProvider cp = sfi.getConnectionProvider();
    Connection con = cp.getConnection();
    

    从那里你可以得到PreparedStatementConnection#prepareStatement()

    现在,有人声称您可以将返回的PreparedStatement 转换为OraclePreparedStatement

    无论如何,你为什么需要OraclePreparedStatement,也许你可以实现你的目标?

    【讨论】:

    • 我们需要调用“OraclePreparedStatement.setFormOfUse(int, short)”
    • 但我最终实现了一个使用反射调用这些方法的函数,而不是尝试获取OraclePreparedStatement。有了这个,我可以处理 T4CPreparedStatement。
    【解决方案2】:

    看起来没有办法做到这一点,相反,我们结束了使用 Java 反射在 OraclePreparedStatementWrapper 上调用 setFormOfUse 的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多