将OraclePreparedStatement与DBCP连接一起使用

时间:2011-09-20 12:16:37

标签: java oracle casting prepared-statement

我正在尝试使用dbcp框架为我的oracle服务器建立连接池。 我使用此tutorial进行连接。 问题是使用此连接创建OraclePreparedStatement:

Connection oracleCon;
OraclePreparedStatement o_stmt;
String sql = "INSERT INTO T002_metadata (T002_datacitexml,T002_version, T002_active)       VALUES (?,?,?) RETURNING T002_id INTO ?";


oracleCon = ConnectionManager.ds.getConnection();

o_stmt = ((OraclePreparedStatement) oracleCon.prepareStatement(sql));

执行此操作后,将抛出异常。

org.apache.commons.dbcp.DelegatingPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement

是否有可能发表声明?

4 个答案:

答案 0 :(得分:2)

不是Oracle课程,不是。这就是JDBC的用途。这是一个API。仅使用java.sql.PreparedStatement。通过尝试向下转换,你违反了多态性并破坏了这样的事情,其中​​一个库包装真实的连接和语句,为你提供一些额外的服务。

答案 1 :(得分:1)

我今天遇到了同样的问题,并通过改变Tomcat配置来解决它here。 我通过更改类型和工厂属性更改了context.xml文件:

....
<Resource name="jdbc/dsName"
       auth="Container"
          type="oracle.jdbc.pool.OracleDataSource"
          factory="oracle.jdbc.pool.OracleDataSourceFactory"
       user="username"
       password="password"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbcurl"/>
....

还必须更改web.xml文件中的资源定义

....
 <resource-ref>
    <description>Oracle datasource</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <!-- <res-type>javax.sql.DataSource</res-type>-->
    <res-type>oracle.jdbc.pool.OracleDataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
....

我的代码中没有任何更改。

答案 2 :(得分:0)

如果您正在使用Oracle,则可以将连接转换为OracleConnection,然后进行转换 您准备好的OraclePreparedStatement语句。 jdbc所做的是将Oracle对象向上转换为标准sql对象,但它们仍然是Oracle sql对象。

答案 3 :(得分:0)

我使用实用程序方法

public static OraclePreparedStatement getOraclePreparedStatement(PreparedStatement stmt) {
        if (stmt instanceof OraclePreparedStatement) {
            return (OraclePreparedStatement) stmt;
        }
        if (stmt instanceof DelegatingPreparedStatement) {
            DelegatingPreparedStatement stmt1 = (DelegatingPreparedStatement) stmt;

            return (OraclePreparedStatement) stmt1.getInnermostDelegate();
        }
        System.out.println(stmt);
        throw new RuntimeException("unknown statement");
    }

从本质上讲,它允许独立使用相同的代码(例如在测试中)或在tomcat中使用。我使用它而不是强制转换,因此代码不会更长。

try (OraclePreparedStatement stmt = getOraclePreparedStatement(con.prepareStatement(SQL_INSERT_TREATMENT))) {
    ...
    }