2013-08-19 40 views
3

我得到以下java.lang.ClassCastException:com.mchange.v2.c3p0.impl.NewProxyConnection

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) 

回答

4
您使用的是預計您的Connection是一個特定的Oracle連接類Oracle特有的API

。但是您正在使用的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連接。

祝你好運!

0

最簡單的方法:

  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); 
    
2

展開您的C3P0代理連接

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

確保你正確地關閉你的連接。