web-dev-qa-db-fra.com

Aucune connexion gérée disponible dans le délai de blocage configuré (JBoss 7 et Postgres)

Je reçois périodiquement une erreur:

ERREUR JDBCExceptionReporter -> javax.resource.ResourceException: IJ000453: Impossible d'obtenir la connexion gérée pour Java: jboss/datasources/myDB 08: 12: 05,928 ERREUR [org.Apache.catalina.core.ContainerBase. [Jboss.web]. [ hôte-par défaut]. [/ mySoftware]. [jsp]] (ajp - xx.255.0.yyy-8109-21) Servlet.service () pour servlet jsp a levé l'exception: javax.resource.ResourceException: IJ000655: Aucune connexion gérée disponible dans le délai de blocage configuré (30000 [ms]) sur org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection (SemaphoreArrayLrayManistConnectionPool.Java:377), etc.

.

Donc, j'ai la prochaine configuration de source de données. sur JBoss AS:

<datasource jta="true" jndi-name="Java:jboss/datasources/myDB" pool-name="ssbs-pssbs" enabled="true" use-ccm="true">
                    <connection-url>jdbc:postgresql://xx.255.0.yyy/myDatabase</connection-url>
                    <driver-class>org.postgresql.Driver</driver-class>
                    <driver>postgresql-jdbc4</driver>
                    <pool>
                        <min-pool-size>30</min-pool-size>
                        <max-pool-size>150</max-pool-size>
                        <prefill>true</prefill>
                        <use-strict-min>false</use-strict-min>
                        <flush-strategy>FailingConnectionOnly</flush-strategy>
                    </pool>
                    <security>
                        <user-name>tick</user-name>
                        <password>tack</password>
                    </security>
                    <validation>
                        <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>false</background-validation>
                    </validation>
                    <timeout>
                        <blocking-timeout-millis>30000</blocking-timeout-millis>
                        <idle-timeout-minutes>5</idle-timeout-minutes>
                    </timeout>
                    <statement>
                        <share-prepared-statements>false</share-prepared-statements>
                    </statement>
                </datasource>

et sur mon serveur Postgres, j'autorise max_connection sur 500. Pourquoi ai-je cette exception?

19
Benjamin

Votre problème principal est probablement une fuite de connexion, mais peut-être pas. En d'autres termes, les transactions de base de données quittent le pool et ne sont pas retournées. Dans ce cas, il y a quelques choses spécifiques pour commencer car le problème est probablement un problème code et non un problème base de données.

La première chose à vérifier est l'état actuel de tout dans pg_stat_activity. Cela inclut la requête la plus récente et l'état de la transaction. Dans une fuite de connexion, vous trouverez probablement un grand nombre de connexions IDLE avec des requêtes similaires. Les requêtes peuvent vous aider à localiser la fuite de connexion. Également dans une fuite de connexion, lorsque le problème démarre, il continuera jusqu'à ce que vous redémarriez les choses.

Dans le cas où le problème est en fait trop peu de connexions disponibles, vous verrez alors beaucoup de connexions ACTIVE. Dans ce cas, augmentez le nombre de connexions dans votre pool. Dans ce cas également, le problème se produira par intermittence et semblera alors disparaître de lui-même.

5
Chris Travers