2013-01-26 10 views
8

Ho il codice seguito nel mio programma Java che mi permette di copiare i dati da un file nel mio database Postgres:COPIA DA e pool di connessioni C3PO in 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); 

Questo codice funziona benissimo, ma vorrei utilizzare un pool di connessioni per gestire le mie connessioni, in quanto ho questo codice in esecuzione per numerosi file. Quindi ho usato 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(); 
} 
} 

Tuttavia, quando ottengo una connessione dal pool di connessioni al di sopra e cercare di usarlo con CopyManager come nell'esempio qui sotto, il codice non funziona

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

sto cercando di indovinare il problema è con la connessione, ma non riesco a capire cosa ne sia diverso. Ho provato a intercettare l'errore con SQLException e IOException, ma non riesce nemmeno a prenderlo. Qualcuno ha incontrato questo?

---- AGGIORNATO ----

Grazie alla a_horse_with_no_name la guida su questo. Il seguente codice ha funzionato per me

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

La traccia di stack completa dell'errore è? Perché stai inizializzando un campo statico da un costruttore? E cosa ti fa pensare che le connessioni restituite da C3P0 siano istanze di BaseConnection (qualunque sia questa classe potrebbe essere?) –

+0

Cosa intendi per "non funziona"? Qualche eccezione di qualche tipo generata? Appende? – AHungerArtist

+0

@AHungerArtist: "Non funziona" come nei dati nel file non viene copiato nella tabella. Non c'è eccezione lanciata, né appesa; continua come se il codice fosse stato eseguito. – Jaycal

risposta

4

La piscina non ti dà la connessione "nativo", a mani sempre fuori un oggetto proxy:

Dal manuale:

c3p0 impacchi questi oggetti dietro un proxy, quindi non è possibile eseguire il cast di connessioni o istruzioni restituite da C3P0 alle classi di implementazione specifiche del fornitore

Probabilmente non è possibile utilizzare il CopyManager utilizzando C3P0. Non sono sicuro, ma forse puoi usare le soluzioni qui descritte: http://www.mchange.com/projects/c3p0/#raw_connection_ops

Se ciò non funziona, potresti voler utilizzare un diverso pool di connessione (ad esempio il nuovo Tomcat 7 JDBC-Pool) che ti consente di accedere alla connessione nativa sottostante .

+0

Grazie per avermi indicato nella giusta direzione. La connessione raw è ciò di cui avevo bisogno per farlo funzionare. Aggiornerò il mio post originale con il codice che ho usato per farlo funzionare. – Jaycal

Problemi correlati