Una explicación del siguiente error:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Resumen:
Abriste 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 sea destruida y la basura recolectada no libera la conexión a la base de datos. La solución más rápida para 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 de postgresql permitidas:
show max_connections;
El valor predeterminado es 100. PostgreSQL en un buen hardware puede admitir algunos cientos de conexiones a la vez. Si desea tener miles, debería considerar el uso de 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 que se utilizan actualmente es:
SELECT COUNT(*) from pg_stat_activity;
Estrategia de depuración
Puede dar diferentes nombres de usuario / contraseñas a los programas que podrían no liberar las conexiones para averiguar cuál es, y luego buscar en pg_stat_activity para averiguar cuál no se está limpiando después de sí mismo.
Realice un seguimiento completo de la pila de excepciones cuando no se pudieron crear las conexiones y siga el código hasta donde cree una nueva Connection
, asegúrese de que cada línea de código donde cree una conexión termine con unaconnection.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.
- Primero encuentre su archivo postgresql.conf
- Si no sabe dónde está, consulte la base de datos con el sql:
SHOW config_file;
- El mío está en:
/var/lib/pgsql/data/postgresql.conf
- Inicie sesión como root y edite ese archivo.
- Busque la cadena: "max_connections".
- Verás una línea que dice
max_connections=100
.
- Establezca ese número más grande, verifique el límite para su versión de postgresql.
- Reinicie la base de datos postgresql para que los cambios surtan efecto.
¿Cuál es el máximo de max_connections?
Utilice esta consulta:
select min_val, max_val from pg_settings where name='max_connections';
Entiendo el valor 8388607
, en teoría eso es lo máximo que se le permite 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 sensato como 100. Al programa infractor se le negaría una nueva conexión.
No es necesario aumentar MaxConnections e InitialConnections. Simplemente cierre sus conexiones después de hacer su trabajo. Por ejemplo, si está creando una conexión:
try { connection = DriverManager.getConnection( "jdbc:postgresql://127.0.0.1/"+dbname,user,pass); } catch (SQLException e) { e.printStackTrace(); return; }
Después de hacer su trabajo, estrecha conexión:
try { connection.commit(); connection.close(); } catch (SQLException e) { e.printStackTrace(); }
fuente
Las líneas ofensivas son las siguientes:
MaxConnections=90 InitialConnections=80
Puede aumentar los valores para permitir más conexiones.
fuente
Debe cerrar todas sus conexiones, por ejemplo: si realiza una instrucción INSERT INTO, debe cerrar la declaración y su conexión de esta manera:
statement.close(); Connexion.close():
Y si realiza una declaración SELECT, debe cerrar la declaración, la conexión y el conjunto de resultados de esta manera:
resultset.close(); statement.close(); Connexion.close();
Hice esto y funcionó
fuente