sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo cerrar correctamente la conexión de la fuente de datos?

Observe que está llamando a .getConnection() varias veces. Aunque la documentación podría ser más clara en este frente DataSource.getConnection() en realidad abre una nueva conexión (en lugar de devolver una existente), por lo que debe cerrar cada instancia devuelta por ese método.

Como .getConnection() crea una nueva instancia cada vez que se llama esta línea es una fuga de conexión, ya que no está cerrando la conexión que se devuelve:

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

Y esta línea abre inútilmente una nueva conexión solo para cerrarla inmediatamente:

dataSource.getConnection().close();

Parece que está intentando abrir y cerrar una conexión separada para cada invocación de isValidUser() (ya que está cerrando la conexión al final de esa llamada de método). Incluso si arregla la fuga descrita anteriormente, no es así como se pretende usar las conexiones. En su lugar, debe compartir una conexión (o una pequeña cantidad de ellas) en su aplicación. Entonces, cuando su programa se inicia, abre dicha conexión, y una vez que todo el programa ya no necesita la conexión (a menudo poco antes de terminar) la cierra.

Este tipo de comportamiento es comúnmente implementado por inyección de dependencia , donde construye sus conexiones y otros recursos y luego los pasa a cualquier objeto que los necesite; esto desvincula la administración de recursos del código que usa esos recursos. Como un ejemplo simplista:

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

Como regla general, los objetos solo deben ser responsables de cerrar los objetos que construyen y deben evitar cerrar los objetos que se les pasan. En su código actual UserDaoImpl está abriendo la conexión, por lo que debería ser responsable de cerrarla, pero sugiero pasar la Connection en su lugar.