В течение настроенного таймаута блокировки недоступны управляемые соединения (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. В этом случае увеличьте количество подключений в вашем пуле. Также в этом случае проблема будет возникать с перерывами, а затем, по-видимому, сама по себе сама по себе.