Java 在Postgres中从和C3PO连接池复制

Java 在Postgres中从和C3PO连接池复制,java,postgresql,jdbc,c3p0,Java,Postgresql,Jdbc,C3p0,我的JAVA程序中有以下代码,允许我将数据从文件复制到Postgres数据库中: Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:####/myDb", "myuser", "mypassword"); CopyManager cm = new CopyManager((BaseConnect

我的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);
这段代码运行得很好,但我想使用连接池来管理我的连接,因为我已经为许多文件运行了这段代码。所以我用了

但是,当我从上面的连接池中获取连接并尝试将其与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捕获错误,但都没有捕获。有人遇到过这种情况吗

----已更新----

多亏了一匹没有名字的马提供了这方面的指导。下面的代码对我有用

// 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
}

池不提供“本机”连接,它始终提供代理对象:

从手册中:

C3P0将这些对象包装在代理之后,因此不能将C3P0返回的连接或语句强制转换为特定于供应商的实现类

您可能无法使用C3P0使用CopyManager。我不确定,但也许您可以使用此处描述的变通方法:


如果这不起作用,您可能需要使用另一个连接池(例如,新的连接池),该连接池允许您访问底层本机连接。

错误的完整堆栈跟踪是?为什么要从构造函数初始化静态字段?是什么让您认为C3P0返回的连接是BaseConnection的实例(不管这个类可能是什么?)您所说的不工作是什么意思?是否引发任何类型的异常?是否挂起?@AHungerArtist:“不工作”,因为文件中的数据未复制到表中。没有抛出异常,也没有挂起异常;它就像代码被执行一样继续运行。@JB Nizet:没有抛出堆栈跟踪,我从构造函数初始化了它,所以我只有一个池实例,并且我知道C3P0不会返回BaseConnection的实例;这就是我为什么要投它的原因?这是我的错吗?我不知道。在调试器中执行代码以查看其功能。我们对你的代码了解不够。我怀疑您正在捕获抛出的异常。另外,只有当对象是此类的实例时,才可以将对象强制转换为类。感谢您为我指明了正确的方向。我需要的是原始连接,以使其正常工作。我会用我使用的代码来更新我的原始帖子。
// 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
}