Uma explicação do seguinte erro:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Resumo:
Você abriu mais do que o limite permitido de conexões com o banco de dados. Você executou algo assim: Connection conn = myconn.Open();
dentro de um loop e se esqueceu de executar conn.close();
. Só porque sua classe foi destruída e o lixo coletado não libera a conexão com o banco de dados. A solução mais rápida para isso é garantir que você tenha o seguinte código com qualquer classe que cria uma conexão:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
Coloque esse código em qualquer classe onde você cria uma conexão. Então, quando sua classe for coletada como lixo, sua conexão será liberada.
Execute este SQL para ver as conexões máximas do postgresql permitidas:
show max_connections;
O padrão é 100. PostgreSQL em um bom hardware pode suportar algumas centenas de conexões por vez. Se você deseja ter milhares, deve considerar o uso de software de pool de conexão para reduzir a sobrecarga de conexão.
Dê uma olhada em exatamente quem / o quê / quando / onde está mantendo suas conexões abertas:
SELECT * FROM pg_stat_activity;
O número de conexões usadas atualmente é:
SELECT COUNT(*) from pg_stat_activity;
Estratégia de depuração
Você pode dar nomes de usuário / senhas diferentes aos programas que podem não estar liberando as conexões para descobrir qual é, e então olhar em pg_stat_activity para descobrir qual deles não está limpando depois de si mesmo.
Faça um rastreamento de pilha de exceção completo quando as conexões não puderam ser criadas e siga o código de volta até onde você criou um novo Connection
, certifique-se de que cada linha de código onde você cria uma conexão termina com umconnection.close();
Como definir max_connections mais alto:
max_connections no postgresql.conf define o número máximo de conexões simultâneas com o servidor de banco de dados.
- Primeiro encontre seu arquivo postgresql.conf
- Se você não sabe onde está, consulte o banco de dados com o sql:
SHOW config_file;
- O meu está em:
/var/lib/pgsql/data/postgresql.conf
- Faça login como root e edite esse arquivo.
- Procure a string: "max_connections".
- Você verá uma linha que diz
max_connections=100
.
- Aumente esse número, verifique o limite para sua versão do postgresql.
- Reinicie o banco de dados postgresql para que as alterações tenham efeito.
Qual é o máximo max_connections?
Use esta consulta:
select min_val, max_val from pg_settings where name='max_connections';
Eu entendi o valor 8388607
, em teoria é o máximo que você pode ter, mas um processo descontrolado pode consumir milhares de conexões e, surpresa, seu banco de dados não responde até a reinicialização. Se você tivesse um max_connections sensível como 100. O programa ofensivo teria uma nova conexão negada.
Não há necessidade de aumentar MaxConnections e InitialConnections. Apenas feche suas conexões após fazer seu trabalho. Por exemplo, se você estiver criando uma conexão:
try { connection = DriverManager.getConnection( "jdbc:postgresql://127.0.0.1/"+dbname,user,pass); } catch (SQLException e) { e.printStackTrace(); return; }
Depois de fazer seu trabalho, feche a conexão:
try { connection.commit(); connection.close(); } catch (SQLException e) { e.printStackTrace(); }
fonte
As linhas ofensivas são as seguintes:
MaxConnections=90 InitialConnections=80
Você pode aumentar os valores para permitir mais conexões.
fonte
Você precisa fechar todas as suas conexões, por exemplo: Se você fizer uma instrução INSERT INTO, você precisa fechar a instrução e sua conexão desta forma:
statement.close(); Connexion.close():
E se você fizer uma instrução SELECT, você precisa fechar a instrução, a conexão e o conjunto de resultados desta forma:
resultset.close(); statement.close(); Connexion.close();
eu fiz isso e funcionou
fonte