В течение настроенного таймаута блокировки недоступны управляемые соединения (JBoss 7 и Postgres)
Периодически я получаю ошибку:
ОШИБКА JDBCExceptionReporter → javax.resource.ResourceException: IJ000453: Не удалось получить управляемое соединение для java: jboss/datasources/myDB 08: 12: 05,928 ОШИБКА [org.apache.catalina.core.ContainerBase. [Jboss.web]. [Default-host]. [/MySoftware]. [Jsp]] (ajp - xx.255.0.yyy-8109- 21) Servlet.service() для сервлета jsp забросило исключение: javax.resource.ResourceException: IJ000655: управляемых соединений не было доступно в течение установленного таймаута блокировки (30000 [мс]) на org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:377) и т.д.
.
Итак, у меня есть следующая конфигурация datasource. на 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>
и на моем сервере Postgres я допускаю max_connection на 500.
Почему я получаю это исключение?
Ответы
Ответ 1
Ваша основная проблема - это, вероятно, утечка соединения, но, возможно, нет. Другими словами транзакции базы данных покидают пул и не возвращаются. В этом случае для начала есть несколько конкретных вещей, потому что проблема, вероятно, является проблемой кода, а не проблемой базы данных.
Первое, что нужно проверить, это текущий статус всего в pg_stat_activity
. Это включает в себя самый последний запрос и состояние транзакции. В утечке соединения вы, вероятно, найдете большое количество соединений IDLE
с похожими запросами. Запросы могут помочь вам отслеживать утечку соединения. Также при утечке соединения, когда проблема начнется, она будет продолжаться до тех пор, пока вы не перезапустите все.
В случае, когда проблема на самом деле слишком мало доступных подключений, вы увидите много соединений ACTIVE
. В этом случае увеличьте количество подключений в вашем пуле. Также в этом случае проблема будет возникать с перерывами, а затем, по-видимому, сама по себе сама по себе.