Apache Commons DBCP connection object problem, Thread: ClassCastException in org.apache.tomcat.dbcp.dbcp.poolingDataSource$PoolGuardConnectionWrapper

2022-09-01 13:59:25

我正在使用Apache Commons DBCP () Connection pool。commons-dbcp.jar

一旦我从池中获得连接,它就会被包装在类中。org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

我的要求是将字符串数组传递给Oracle中的pl / sql存储过程。

以下是我在以下代码段中执行的操作:

Connection dbConn = ConnectionManager.ds.getConnection();
//The above statement returns me an connection wrapped in the class
//org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.

org.apache.commons.dbcp.DelegatingConnection del = new org.apache.commons.dbcp.DelegatingConnection(dbConn.getConnection());
con = del.getInnermostDelegate();

cs = con.prepareCall("call SP_NAME(?,?,?,?)");
oracle.sql.ArrayDescriptor arDesc= oracle.sql.ArrayDescriptor.createDescriptor("ARRAY_NAME", (OracleConnection) con);

CallableStatement c_stmt = conn.prepareCall("begin update_message_ids_ota
(:x); end;" );
c_stmt.setArray( 1, array_to_pass );
c_stmt.execute();

在执行上述代码时,我得到以下异常:

java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper can not cast to oracle.jdbc.OracleConnection at oracle.sql.ArrayDescriptor.createDescriptor

我试图在几乎整个网站和论坛中找到解决方案,但无法得到满意的答案或解决方案。


答案 1

缺省情况下,DBCP 不允许访问“真实”的基础数据库连接实例,因此您无法访问 Oracle 类。

配置池时,可以设置

accessToUnderlyingConnectionAllowed = true

然后它的工作原理。

默认值为 false,这是一个潜在的危险操作,行为不端的程序可能会造成有害的事情。(关闭底层或当受保护的连接已关闭时继续使用它)请小心,仅在需要直接访问特定于驱动程序的扩展时使用

注意:不要关闭基础连接,而只能关闭原始连接。


答案 2

如果您使用的是符合 Java 6 的 JDBC 连接,则可以使用如下所示的代码:

OracleConnection oracleConnection = null;
try {
    if (connection.isWrapperFor(OracleConnection.class)) {
        oracleConnection = connection.unwrap(OracleConnection.class);
    }
} catch (SQLException ex) {
    // do something
}
return oracleConnection;

从这一点开始,使用 而不是原始的 .oracleConnectionconnection

查看 http://docs.oracle.com/javase/6/docs/api/java/sql/Wrapper.html


推荐