Olá! Tudo bem? Olhando aqui seu código, existem algumas conexões que não estão sendo fechadas no arquivo ContaService, essas conexões supostamente estariam sendo fechadas no arquivo ContaDAO, que recebe uma conexão no construtor e a fecha em seus métodos. O problema é justamente esse: as conexões estão sendo fechadas em uma classe diferente daquela que ela foi instaciada, sendo usada inclusive como atributo da classe. Durante esse processo acaba que o fechamento da conexão que é atributo da classe ContaDAO não influencia na conta que foi criada em ContaService. Para resolver esse problema, removi as chamadas do método close de ContaDAO e coloquei em ContaService. Os arquivos ficaram assim:
// arquivo ContaService
public Set<Conta> listarContasAbertas() {
try (Connection conn = connection.recuperarConexao()) {
return new ContaDAO(conn).listar();
} catch (SQLException e) {
throw new RuntimeException("Erro de conexão com o banco de dados");
}
}
public void abrir(DadosAberturaConta dadosDaConta) {
try (Connection conn = connection.recuperarConexao()) {
new ContaDAO(conn).salvar(dadosDaConta);
} catch (SQLException e) {
throw new RuntimeException("Erro de conexão com o banco de dados");
}
}
private void alterar(Conta conta, BigDecimal valor) {
try (Connection conn = connection.recuperarConexao()) {
new ContaDAO(conn).alterar(conta.getNumero(), valor);
System.out.println("Alteração feita com sucesso");
System.out.println(conta);
} catch (Exception e) {
throw new RuntimeException("Não foi possível concluir a operação");
}
}
private Conta buscarContaPorNumero(Integer numero) {
try (Connection conn = connection.recuperarConexao()) {
var conta = new ContaDAO(conn).listarPorNumero(numero);
if (conta != null) {
return conta;
} else {
throw new RegraDeNegocioException("Não existe conta cadastrada com esse numero");
}
} catch (SQLException e) {
throw new RuntimeException("Erro de conexão com banco de dados");
}
}
// Resto do código omitido
Os outros métodos que não abriam conexões não foram alterados, já no arquivo ContaDAO, removi todas as linhas que tinham o código:
// arquivo ContaDAO
// Removendo essas linhas:
conn.close();
Após as alterações, fui no arquivo ConnectionFactory e somente com 2 conexões já foi possível rodar a aplicação sem problema:
// arquivo ConnectionFactory
private HikariDataSource createDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/byte_bank");
config.setUsername("root");
config.setPassword("root");
config.setMaximumPoolSize(2);
return new HikariDataSource(config);
}
Testando aqui na minha máquina tudo deu certo, espero que consiga ter ajudado e que tudo funcione aí também!