8

私のJAVAプログラムには、ファイルからPostgresデータベースにデータをコピーできる次のコードがあります。

Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:####/myDb", 
                                                   "myuser", "mypassword"); 
CopyManager cm = new CopyManager((BaseConnection) con);
cm.copyIn("COPY prices FROM STDIN WITH DELIMITER AS ','", 
             new BufferedReader(new FileReader(filepath)), buffersize);

このコードは正常に機能しますが、このコードを多数のファイルに対して実行しているため、接続プールを使用して接続を管理したいと思います。そこで、C3P0を使用しました。

public static final ComboPooledDataSource cpds = new ComboPooledDataSource();

public class MyPooledConnection {
MyPooledConnection() throws PropertyVetoException {
    cpds.setDriverClass("org.postgresql.Driver"); 
    cpds.setJdbcUrl("jdbc:postgresql://localhost:5432/myStockDatabase"); 
    cpds.setUser("myUserName"); 
    cpds.setPassword("myPassword"); 
    cpds.setInitialPoolSize(4);
    cpds.setMinPoolSize(4);
    cpds.setMaxIdleTime(30);
    cpds.setMaxPoolSize(MAX_CONNECTIONS);
}

public static Connection getConnection() {
    return cpds.getConnection();
}
}

ただし、上記の接続プールから接続を取得し、以下の例のようにCopyManagerで使用しようとすると、コードが機能しません

Connection pooled_con = MyPooledConnection.getConnection();
CopyManager cm = new CopyManager((BaseConnection) pooled_con);
cm.copyIn("COPY prices FROM STDIN WITH DELIMITER AS ','", 
             new BufferedReader(new FileReader(filepath)), buffersize);

接続に問題があると思いますが、どう違うのかわからないようです。SQLExceptionとIOExceptionでエラーをキャッチしようとしましたが、どちらもキャッチしません。誰かがこれに遭遇しましたか?

----更新----

a_horse_with_no_nameに感謝します。これに関するガイダンス。次のコードは私のために働いた

// Cast the connection as a proxy connection
C3P0ProxyConnection proxycon = (C3P0ProxyConnection)cpds.getConnection();
try {

    // Pass the getCopyAPI (from PGConnection) to a method
    Method m = PGConnection.class.getMethod("getCopyAPI", new Class[]{});
    Object[] arg = new Object[] {};

    // Call rawConnectionOperation, passing the method, the raw_connection, 
    // and method parameters, and then cast as CopyManager
    CopyManager cm = (CopyManager) proxycon.rawConnectionOperation(m,
                                         C3P0ProxyConnection.RAW_CONNECTION,arg);
    cm.copyIn("COPY prices FROM STDIN WITH DELIMITER AS ','", new BufferedReader(new 
                                                FileReader(filepath)), buffersize);
} catch (NoSuchMethodException | IllegalAccessException 
                        | IllegalArgumentException | InvocationTargetException e) {
    // Deal with errors here
}
4

2 に答える 2

4

プールは「ネイティブ」接続を提供せず、常にプロキシオブジェクトを配布します。

マニュアルから:

C3P0はこれらのオブジェクトをプロキシの背後でラップするため、C3P0から返された接続またはステートメントをベンダー固有の実装クラスにキャストすることはできません。

C3P0を使用してCopyManagerを使用することはおそらくできません。よくわかりませんが、ここで説明されている回避策を使用できます:http ://www.mchange.com/projects/c3p0/#raw_connection_ops

それが機能しない場合は、基盤となるネイティブ接続へのアクセスを提供する別の接続プール(新しいTomcat 7 JDBC-Poolなど)を使用することをお勧めします。

于 2013-01-26T18:26:19.130 に答える