Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fechar corretamente a conexão da fonte de dados?


Observe que você está chamando .getConnection() várias vezes. Embora a documentação possa ser mais clara nesse aspecto DataSource.getConnection() na verdade abre uma nova conexão (em vez de retornar uma existente), portanto, você precisa fechar cada instância retornada desse método.

Como .getConnection() cria uma nova instância toda vez que é chamada esta linha é um vazamento de conexão, pois não está fechando a conexão que está sendo retornada:
pstmt = dataSource.getConnection().prepareStatement(query);

E esta linha abre uma nova conexão apenas para fechá-la imediatamente:
dataSource.getConnection().close();

Parece que você está tentando abrir e fechar uma conexão separada para cada invocação de isValidUser() (já que você está fechando a conexão no final dessa chamada de método). Mesmo que você conserte o vazamento descrito acima, não é assim que as conexões devem ser usadas. Em vez disso, você deve compartilhar uma conexão (ou um pequeno número delas) em seu aplicativo. Assim, quando seu programa inicializa, você abre essa conexão e, uma vez todo o programa não precisa mais da conexão (geralmente pouco antes de encerrar), você a fecha.

Esse tipo de comportamento é comumente implementado por injeção de dependência , onde você constrói suas conexões e outros recursos e os passa para quaisquer objetos que precisem deles - isso dissocia o gerenciamento de recursos do código que usa esses recursos. Como um exemplo 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 regra geral, os objetos devem ser responsáveis ​​apenas por fechar os objetos que eles constroem e devem evitar fechar os objetos que são passados. Em seu código atual UserDaoImpl está abrindo a conexão, então deve ser responsável por fechá-la, mas estou sugerindo passar o Connection em vez de.