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
}
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?) –
Cosa intendi per "non funziona"? Qualche eccezione di qualche tipo generata? Appende? – AHungerArtist
@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