PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:desculpe, muitos clientes já

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 esqueci de executar conn.close(); . Só porque sua classe é 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 crie 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 em que 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. O PostgreSQL em um bom hardware pode suportar algumas centenas de conexões por vez. Se você quiser ter milhares, considere usar um software de pool de conexões para reduzir a sobrecarga de conexão.

Dê uma olhada exatamente em 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

  1. Você pode fornecer nomes de usuário/senhas diferentes para os programas que podem não estar liberando as conexões para descobrir qual é e, em seguida, procurar em pg_stat_activity para descobrir qual deles não está se limpando.

  2. Faça um rastreamento de pilha de exceção completo quando as conexões não puderem ser criadas e siga o código de volta até onde você cria uma nova Connection , certifique-se de que cada linha de código em que você cria uma conexão termine com um connection.close();

Como definir o 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.
  1. Primeiro encontre seu arquivo postgresql.conf
  2. Se você não sabe onde está, consulte o banco de dados com o sql:SHOW config_file;
  3. O meu está em:/var/lib/pgsql/data/postgresql.conf
  4. Faça login como root e edite esse arquivo.
  5. Pesquise a string:"max_connections".
  6. Você verá uma linha que diz max_connections=100 .
  7. Defina esse número maior, verifique o limite para sua versão do postgresql.
  8. Reinicie o banco de dados postgresql para que as alterações tenham efeito.

Qual ​​é o máximo de max_connections?

Use esta consulta:
select min_val, max_val from pg_settings where name='max_connections';

Recebo o valor 8388607 , em teoria, isso é 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 sensato como 100. O programa ofensivo seria negado uma nova conexão.