web-dev-qa-db-fra.com

Provoqué par: org.postgresql.util.PSQLException: FATAL: les emplacements de connexion restants sont réservés aux connexions de superutilisateur sans réplication

J'utilise c3p0-0.9.5.2.jar et mchange-commons-Java-0.2.11.jar pour gérer la connexion au pool, et j'utilise postgreSql 9.3.

Je reçois ces messages au moins une fois par jour dans mon environnement Prod:

Caused by: Java.sql.SQLException: Connections could not be acquired from the underlying database!
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.Java:118)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.Java:692)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.Java:140)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.Java:81)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.Java:446)
    ... 212 more
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.Java:1469)
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.Java:644)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.Java:554)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.Java:758)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.Java:685)
    ... 215 more
Caused by: org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
    at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.Java:712)

J'ai cette config dans mon application:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
         <bean id="dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
       <property name="driverClass" value="org.postgresql.Driver"/>

        <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/Test"/> 

        <property name="user" value="postgres"/>
        <property name="password" value="postgres"/>
           <!-- pool sizing -->
     <!-- pool sizing -->
        <property name="initialPoolSize" value="32" />
        <property name="minPoolSize" value="30" />
        <property name="maxPoolSize" value="300" />
        <property name="acquireIncrement" value="10" />
        <property name="maxStatements" value="0" />

        <!-- retries -->
        <property name="acquireRetryAttempts" value="30" />
        <property name="acquireRetryDelay" value="1000" /> <!-- 1s -->
        <property name="breakAfterAcquireFailure" value="false" />

        <!-- refreshing connections -->
        <property name="maxIdleTime" value="180" /> <!-- 3min -->
        <property name="maxConnectionAge" value="10" /> <!-- 1h -->

        <!-- timeouts and testing -->
        <property name="checkoutTimeout" value="0" /> <!-- 60s -->
        <property name="idleConnectionTestPeriod" value="60" /> <!-- 60 -->
        <property name="testConnectionOnCheckout" value="true" />
        <property name="preferredTestQuery" value="SELECT 1" />
        <property name="testConnectionOnCheckin" value="true" /> 

    </bean>
</beans>

dans postgresql.conf j'ai cette config:

max_connections = 300
shared_buffers = 32GB

mon serveur a cette performance: 24 cpu, 256 Go de mémoire

le nombre d'utilisateurs utilisant l'application est d'environ 1300

y a-t-il quelqu'un qui peut m'aider à résoudre ce problème

merci d'avance

8
franco

Il y a superuser_reserved_connections emplacements de connexion (par défaut) qui sont réservés aux superutilisateurs afin qu'ils puissent se connecter même dans une situation où tous les emplacements de connexion sont occupés.

Ainsi, vous ne disposez effectivement que de 297 emplacements.

Réduisez le nombre maximal de connexions de votre pool de connexions ou augmentez max_connections dans PostgreSQL.

Soit dit en passant, 300 est beaucoup trop élevé. Vous devez utiliser un paramètre beaucoup plus bas avec un pool de connexions (sauf si vous avez des centaines de cœurs dans votre machine de base de données).

16
Laurenz Albe