Estou desenvolvendo uma aplicação que acessa o Banco de Dados (PostgreSQL) utilizando uma classe DAO.
Toda vez que vou fazer uma operação no banco, crio um DAO, que cria uma conexão. Executo as queries e tudo mais que deve ser feito no banco e depois fecho (conexao.close()).
A aplicação está rodando super bem, porém, como estou ainda desenvolvendo, faço vários teste. Após muitas execuções percebo que não só a aplicação como o computador em geral ficam extremamente lentos.
Abrindo o Gerenciador de Tarefas do Windows, na aba Processos, percebo que existem vários processos do Postgre executando.
Se fechei todas as conexoes, porque esses processos continuam abertos? Como faço para isso não ocorrer?
Por que um construtor para a conexão e um método estático COM PARÂMETRO para seu fechamento?
Teoricamente posso usar o seguinte código que estaria correto:
DAO dao1 = new DAO();
DAO dao2 = new DAO();
DAO dao3 = new DAO();
// operações
dao2.fechaConexao(dao3);
dao1.fechaConexao(dao2);
dao3.fechaConexao(dao1);
Meio estranho não é?
Um código mais proveitoso e que pode lhe ajudar no seu problema seria:
public class BancoDeDadosDAO
{
Connection conexao;
public BancoDeDadosDAO()
{
try
{
Class.forName("org.postgresql.Driver");
conexao = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Livros?user=PAULOHENRIQUE&password=12503869");
}
catch(ClassNotFoundException e)
{ System.err.println(e.getMessage()); }
catch (SQLException e)
{ System.err.println(e.getMessage()); }
}
// Aqui vem os diversos métodos que o DAO executa, inserções,
// selects para serem usados para popular combos etc...
public void fecharConexao()
{
try
{ conexao.close(); }
catch (SQLException e)
{ System.err.println(e.getMessage()); }
finally
{ conexao = null; }
}
}
Uma coisa que torna o acesso ao banco de dados extremamente lento é ficar com esse abre, fecha, abre, fecha de conexões. O interessante seria você criar um pool de conexões, onde seriam abertas várias conexões (você pode configurar esse número) e sempre que um DAO precisasse de uma conexão ele pegaria uma já aberta no pool, através, por exemplo, de um método estático.
Com isso ganha-se muito tempo e suas transações ficam bem mais rápidas. Para implementar seu pool você pode usar o DBCP, o C3PO, entre outros.
O PostgreSQL, em Windows, cria um processo para cada conexão, mas ele não o derruba imediatamente após encerrar a conexão, para evitar o grande overhead resultante de iniciar um processo para atender a conexão.
Então nesse caso seria melhor se abrisse uma conexão quando iniciar a execução do programa e deixar ela aberta? só fechar quando encerrasse o programa?