Nota che stai chiamando .getConnection()
più volte. Anche se la documentazione potrebbe essere più chiara su questo fronte DataSource.getConnection()
effettivamente si apre una nuova connessione (anziché restituirne una esistente), quindi è necessario chiudere ogni istanza restituita da quel metodo.
Come .getConnection()
crea una nuova istanza ogni volta che viene chiamata questa riga è una perdita di connessione, poiché non sta chiudendo la connessione restituita:
pstmt = dataSource.getConnection().prepareStatement(query);
E questa linea apre inutilmente una nuova connessione solo per chiuderla immediatamente:
dataSource.getConnection().close();
Sembra che tu stia tentando di aprire e chiudere una connessione separata per ogni chiamata di isValidUser()
(dal momento che stai chiudendo la connessione alla fine di quella chiamata al metodo). Anche se si corregge la perdita descritta sopra, non è così che si intende utilizzare le connessioni. Dovresti invece condividere una connessione (o un piccolo numero di esse) nell'applicazione. Quindi, quando il tuo programma si avvia, apri una tale connessione e una volta l'intero programma non ha più bisogno della connessione (spesso poco prima di terminare) la chiudi.
Questo tipo di comportamento è comunemente implementato da iniezione di dipendenza , dove costruisci le tue connessioni e altre risorse e poi le passi a qualsiasi oggetto ne abbia bisogno - questo separa la gestione delle risorse dal codice che usa quelle risorse. Come esempio semplicistico:
public static void main(String[] args) {
DataSource dataSource = createDataSource();
try (Connection connection = dataSource.getConnection()) {
runProgram(connection);
}
}
/**
* this method doesn't need to worry about closing the Connection,
* it trusts that its caller will be responsible for that.
*/
private static void runProgram(Connection connection) {
// ...
}
Come regola generale, gli oggetti dovrebbero essere responsabili solo della chiusura degli oggetti che costruiscono e dovrebbero evitare di chiudere gli oggetti che vengono passati. Nel tuo codice attuale UserDaoImpl
sta aprendo la connessione, quindi dovrebbe essere responsabile della sua chiusura, ma sto suggerendo di passare la Connection
invece.