sql >> Base de Datos >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:lo siento, ya hay demasiados clientes

Una explicación del siguiente error:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Resumen:

Abrió más del límite permitido de conexiones a la base de datos. Ejecutó algo como esto:Connection conn = myconn.Open(); dentro de un bucle y se olvidó de ejecutar conn.close(); . El hecho de que su clase se destruya y se recolecte basura no libera la conexión a la base de datos. La solución más rápida a esto es asegurarse de tener el siguiente código con cualquier clase que cree una conexión:

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  

Coloque ese código en cualquier clase donde cree una conexión. Luego, cuando su clase sea recolectada como basura, su conexión será liberada.

Ejecute este SQL para ver las conexiones máximas permitidas de postgresql:

show max_connections;

El valor predeterminado es 100. PostgreSQL en un buen hardware puede admitir unos pocos cientos de conexiones a la vez. Si desea tener miles, debe considerar usar un software de agrupación de conexiones para reducir la sobrecarga de conexión.

Eche un vistazo a exactamente quién/qué/cuándo/dónde mantiene abiertas sus conexiones:

SELECT * FROM pg_stat_activity;

El número de conexiones utilizadas actualmente es:

SELECT COUNT(*) from pg_stat_activity;

Estrategia de depuración

  1. Puede dar diferentes nombres de usuario/contraseñas a los programas que podrían no estar liberando las conexiones para averiguar cuál es, y luego buscar en pg_stat_activity para averiguar cuál no está limpiando después de sí mismo.

  2. Realice un seguimiento completo de la pila de excepciones cuando no se puedan crear las conexiones y siga el código hasta donde crea una nueva Connection , asegúrese de que cada línea de código donde cree una conexión termine con connection.close();

Cómo configurar max_connections más alto:

max_connections en postgresql.conf establece el número máximo de conexiones simultáneas al servidor de la base de datos.

  1. Primero busque su archivo postgresql.conf
  2. Si no sabe dónde está, consulte la base de datos con el sql:SHOW config_file;
  3. El mío está en:/var/lib/pgsql/data/postgresql.conf
  4. Inicie sesión como root y edite ese archivo.
  5. Busque la cadena:"max_connections".
  6. Verás una línea que dice max_connections=100 .
  7. Establezca ese número más grande, verifique el límite para su versión de postgresql.
  8. Reinicie la base de datos postgresql para que los cambios surtan efecto.

¿Cuál es el máximo de conexiones máximas?

Utilice esta consulta:

select min_val, max_val from pg_settings where name='max_connections';

obtengo el valor 8388607 , en teoría, eso es lo máximo que puede tener, pero luego un proceso fuera de control puede consumir miles de conexiones y, sorpresa, su base de datos no responde hasta que se reinicia. Si tuviera un max_connections sensible como 100. Al programa infractor se le negaría una nueva conexión.