java.lang.ClassCastException:com.mchange.v2.c3p0.impl.NewProxyConnection

时间:2013-08-19 05:31:30

标签: sql database oracle jdbc

我得到以下

java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyConnection

执行以下代码时。你能帮我解决一下吗?

            ComboPooledDataSource connPool = new ComboPooledDataSource();
        connPool .setJdbcUrl(PropertyReader.getSystemProperty(DB_URL));         
        connPool .setUser(PropertyReader.getSystemProperty(DB_USER));           
        connPool .setPassword(Decryption.getDecryptedPwd(DB_PASSWORD));
        connPool .setMaxPoolSize(MAX_POOL_SIZE);
        connPool .setMaxIdleTime(MAX_IDLE_TIME);
        connPool .setMinPoolSize(MIN_POOL_SIZE);
        connPool .setMaxAdministrativeTaskTime(15);

        java.sql.Connection conn = connPool.getConnection();
        oracle.sql.CLOB c = CLOB.createTemporary(conn, false, CLOB.DURATION_SESSION);
        Writer writer = c.setCharacterStream(0L);
        writer.write(String.valueOf(pNoListDelimited).toCharArray());
                  writer.flush();
                    writer.close();

异常堆栈跟踪

            java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyConnection
            at oracle.sql.CLOB.createTemporary(CLOB.java:676)
            at oracle.sql.CLOB.createTemporary(CLOB.java:640)
            ……
            …..
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
            at java.util.concurrent.FutureTask.run(FutureTask.java:123)
            at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)
            at java.lang.Thread.run(Thread.java:595)

3 个答案:

答案 0 :(得分:5)

您正在使用特定于Oracle的API,期望您的Connection成为特定的Oracle Connection类。但您正在使用的Connection是c3p0代理连接,而不是Oracle Connection类。

如果您想使用特定于Oracle的API,您可以选择以下几种方法:

  1. 您可以使用c3p0的原始连接操作,请参阅http://www.mchange.com/projects/c3p0/index.html#raw_connection_ops以获取您要查找的精确示例;
  2. c3p0实际上附带了一个执行此操作的Oracle jar文件。然而,它很少使用和陈旧,所以是一粒盐;
  3. 您可以升级到支持完整JDBC4 api的prerelease version of c3p0-0.9.5,并使用解包操作来提取原始Oracle连接。
  4. 祝你好运!

答案 1 :(得分:3)

展开您的c3p0代理连接

 java.sql.Connection conn = connPool.getConnection();
 conn = conn.unwrap(OracleConnection.class);

确保正确关闭连接。

答案 2 :(得分:1)

最简单的方法:

  1. 添加此依赖项:

    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbc</artifactId>
       <version>4.1.3.RELEASE</version>
    </dependency>
    
  2. 创建一个C3P0NativeJdbcExtractor:

    public class C3P0NativeJdbcExtractorImpl extends C3P0NativeJdbcExtractor {
    
        public Connection getNativeConnection(Connection con) throws SQLException {
    
            return doGetNativeConnection(con);
        }
    
    }
    
  3. 将原始连接转换为nativeConnection:

    Connection nativeCon = new C3P0NativeJdbcExtractorImpl().getNativeConnection(ps.getConnection());
    
  4. 使用nativeCon代替conn:

    oracle.sql.CLOB c = CLOB.createTemporary(nativeCon, false, CLOB.DURATION_SESSION);