5

私は以下を取得しています

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

3 に答える 3

5

Connection が特定の Oracle Connection クラスであることを期待する Oracle 固有の API を使用している。ただし、使用している接続はc3p0プロキシ接続であり、Oracle接続クラスではありません。

Oracle 固有の API を使用する場合は、いくつかの選択肢があります。

  1. c3p0 の生の接続操作を使用できます。探している正確な例については、http: //www.mchange.com/projects/c3p0/index.html#raw_connection_ops を参照してください。
  2. c3p0 には、この操作を実行する Oracle 用の jar ファイルが実際に同梱されています。ただし、めったに使用されず、古いため、塩の粒です。
  3. 完全な JDBC4 API をサポートするc3p0-0.9.5 のプレリリース バージョンにアップグレードし、unwrap 操作を使用して未加工の Oracle 接続を抽出できます。

幸運を!

于 2013-08-19T22:46:44.490 に答える
4

c3p0 プロキシ接続のラップを解除します

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

接続を適切に閉じていることを確認してください。

于 2016-07-12T12:30:41.907 に答える
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. conn の代わりに nativeCon を使用します。

    oracle.sql.CLOB c = CLOB.createTemporary(nativeCon, false, CLOB.DURATION_SESSION);
    
于 2014-12-31T00:54:54.887 に答える