Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie schließt man die Datenquellenverbindung richtig?

Beachten Sie, dass Sie .getConnection() aufrufen mehrmals. Obwohl die Dokumentation diesbezüglich klarer sein könnte DataSource.getConnection() tatsächlich öffnet eine neue Verbindung (im Gegensatz zur Rückgabe einer bestehenden), daher müssen Sie jede von dieser Methode zurückgegebene Instanz schließen.

Als .getConnection() erstellt jedes Mal eine neue Instanz, wenn diese Zeile aufgerufen wird, ist ein Verbindungsleck, da sie die zurückgegebene Verbindung nicht schließt:

pstmt = dataSource.getConnection().prepareStatement(query);

Und diese Zeile öffnet verschwenderisch eine neue Verbindung, nur um sie sofort wieder zu schließen:

dataSource.getConnection().close();

Es sieht so aus, als ob Sie versuchen, für jeden Aufruf von isValidUser() eine separate Verbindung zu öffnen und zu schließen (da Sie die Verbindung am Ende dieses Methodenaufrufs schließen). Selbst wenn Sie das oben beschriebene Leck beheben, sind Verbindungen nicht dafür vorgesehen. Stattdessen sollten Sie eine Verbindung (oder eine kleine Anzahl davon) für Ihre Anwendung freigeben. Wenn also dein Programm startet, öffnest du eine solche Verbindung und einmal das ganze Programm braucht die Verbindung nicht mehr (oftmals kurz vor dem Beenden) schließt man sie.

Diese Art von Verhalten wird üblicherweise durch Abhängigkeitsinjektion implementiert , wo Sie Ihre Verbindungen und andere Ressourcen konstruieren und sie dann an die Objekte übergeben, die sie benötigen – dies entkoppelt die Ressourcenverwaltung von dem Code, der diese Ressourcen verwendet. Als vereinfachtes Beispiel:

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) {
  // ...
}

Als Faustregel sollten Objekte nur für das Schließen von Objekten verantwortlich sein, die sie erstellen, und sollten das Schließen von Objekten, an die sie übergeben werden, vermeiden. In Ihrem aktuellen Code UserDaoImpl öffnet die Verbindung, also sollte es für das Schließen verantwortlich sein, aber ich schlage vor, die Connection zu übergeben stattdessen.