Sto tentando di risolvere un problema con un'applicazione Java che utilizza JDBC per connettersi a un database MySQL. Il problema di superficie è che quando si connette a un database valido, DriverManager.getConnection a volte restituisce NULL, mentre solo pochi minuti dopo restituirà una connessione valida allo stesso database esatto.Java/JDBC/MySQL: Come si risolve il problema con cui DriverManager.getConnection() restituisce NULL?
Sono nella posizione di provare a risolvere questo problema, ma la mia comprensione di dove Java, JDBC e MySQL si incontrano è piuttosto limitata. Ho fatto molte ricerche su questo, ma ho colpito un muro e non so dove andare da qui.
Ecco che cosa ho fatto finora:
- Sul lato Java, ho rintracciato il codice fino a DriverManager.getConnection(). Ho determinato che la connessione NULL sta venendo da lì, ma non ho idea di cosa succede sotto il cofano di getConnection. Ho faticato a trovare una spiegazione approfondita di questo online.
- Sul lato MySQL, ho verificato che ci sono molte connessioni disponibili (circa 1000 connessioni libere a volte), quindi so che non sto superando le connessioni massime lì. Guardando i registri, sono stato in grado di determinare che ci sono un numero leggermente più alto di connessioni interrotte durante i periodi di tempo in cui ho più problemi, ma non so come determinare il motivo per cui queste connessioni sono state interrotte (MySQL abort, JDBC, l'applicazione Java?) Non sono sicuro se c'è qualcos'altro che devo cercare sul terminale MySQL.
- Nel mezzo, con JDBC, sono piuttosto perso. Ho letto su MySQL Connector/J allo http://dev.mysql.com/doc/refman/5.1/en/connector-j.html, ma non sono sicuro che tali informazioni riguardino il driver JDBC utilizzato da Java.
Qualsiasi direzione su dove posso andare da qui sarebbe molto apprezzata.
Grazie!
EDIT - 2/15, 10:35 CST Mi scuso per non essere più specifico. Questa applicazione è un'applicazione di produzione che normalmente funziona bene. Elabora con successo decine di migliaia di connessioni al giorno senza alcun problema, è solo che questo problema si presenterà in momenti casuali durante il giorno e continuerà a persistere da 30 secondi a 5 minuti quando accadrà.
Ecco il codice che ho tracciato tutta la strada fino a DriverManager.getConnection:
var dbConn = DatabaseConnectionFactory.createDatabaseConnection('com.mysql.jdbc.Driver','jdbc:mysql://'+ serverName +':' + port + '/' + database, userName, password);
public static DatabaseConnection createDatabaseConnection(String driver, String address, String username, String password) throws SQLException {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
Properties info = new Properties();
info.setProperty("user", username);
info.setProperty("password", password);
// this property should only be set if it's for embedded database
info.setProperty("shutdown", "true");
return new DatabaseConnection(address, info);
}
public DatabaseConnection(String address, Properties info) throws SQLException {
logger.debug("creating new database connection: address=" + address + ", " + info);
this.address = address;
connection = DriverManager.getConnection(address, info);
}
Non credo ci sia in realtà alcun problema con il codice, ma piuttosto un problema da qualche parte tra getConnection() e MySQL.
Posta un po 'di codice e sarà più facile aiutarti. – duffymo
sembra che la connessione (rete) sia inaffidabile e la macchina non sia sempre connessa alla macchina, il db è acceso, quindi a volte la connessione non può essere stabilita –
Jeff - Questo è il mio sospetto, ma è difficile dirlo dove ciò potrebbe accadere. Se esiste un modo per determinare i diversi motivi per cui DriverManager.getConnection restituisce NULL, ciò mi aiuterà a rintracciare in modo significativo questo problema. – TACHEON