Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment fermer correctement la connexion à la source de données ?

Notez que vous appelez .getConnection() plusieurs fois. Bien que la documentation pourrait être plus claire à ce sujet DataSource.getConnection() en fait s'ouvre une nouvelle connexion (au lieu de renvoyer une connexion existante), vous devez donc fermer chaque instance renvoyée par cette méthode.

Comme .getConnection() crée une nouvelle instance à chaque fois qu'elle est appelée cette ligne est une fuite de connexion, car elle ne ferme pas la connexion renvoyée :

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

Et cette ligne ouvre inutilement une nouvelle connexion pour la fermer immédiatement :

dataSource.getConnection().close();

Il semble que vous essayez d'ouvrir et de fermer une connexion distincte pour chaque invocation de isValidUser() (puisque vous fermez la connexion à la fin de cet appel de méthode). Même si vous corrigez la fuite décrite ci-dessus, ce n'est pas ainsi que les connexions sont censées être utilisées. Au lieu de cela, vous devez partager une connexion (ou un petit nombre d'entre elles) dans votre application. Ainsi, lorsque votre programme démarre, vous ouvrez une telle connexion, et une fois l'ensemble du programme n'a plus besoin de la connexion (souvent peu de temps avant de se terminer) vous la fermez.

Ce type de comportement est généralement mis en œuvre par injection de dépendance , où vous construisez vos connexions et autres ressources, puis les transmettez aux objets qui en ont besoin - cela dissocie la gestion des ressources du code qui utilise ces ressources. Comme exemple simpliste :

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

En règle générale, les objets ne doivent être responsables que de la fermeture des objets qu'ils construisent et doivent éviter de fermer les objets qui leur sont transmis. Dans votre code actuel UserDaoImpl ouvre la connexion, il devrait donc être responsable de sa fermeture, mais je suggère de transmettre la Connection à la place.