在配置的阻塞超时内没有可用的托管连接(JBoss 7 和 Postgres)

Posted

技术标签:

【中文标题】在配置的阻塞超时内没有可用的托管连接(JBoss 7 和 Postgres)【英文标题】:No managed connections available within configured blocking timeout (JBoss 7 and Postgres) 【发布时间】:2013-07-02 10:14:57 【问题描述】:

我会定期收到错误:

错误 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 jsp 的 Servlet.service() 抛出异常:javax.resource.ResourceException: IJ000655: 在配置的阻塞超时 (30000 [ms]) 内没有可用的托管连接 在 org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:377) 等处。

.

所以,我有下一个数据源配置。在 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。 为什么我得到这个异常?

【问题讨论】:

看起来池中的所有托管连接都在使用中? 30000 [ms] 是相当大的延迟。我会检查你是否在使用后正确释放连接,数据库上的平均事务需要多长时间,当然还有多少线程试图同时获得连接。 而您遇到这种情况是因为您达到了应用服务器配置的 150 个连接的限制。你是如何与这些联系互动的?普通的 JDBC? JPA? 我使用的是 Hibernate 3.6。 2 应用程序在 postgres 服务器上使用一个数据库。每隔 2 天,我的应用程序会写“无法为 java:jboss/datasources/myDB 08:12:05,928 ERROR 获取托管连接”,通常 2 个应用程序“max”可以使用 250 个连接到 DB。我有 500 个连接,但出现错误。以及我通过 pgadmin 创建“统计服务器”报告并查看很多连接状态为“提交”并且它们永远保持状态。 这个问题解决了吗?如果是,如何? 我也面临同样的问题,有人对此有什么建议吗?谢谢 【参考方案1】:

您的主要问题可能是连接泄漏,但也可能不是。换句话说,数据库事务正在离开池并且没有被返回。在这种情况下,有一些具体的事情要开始,因为问题可能是 代码 问题而不是 数据库 问题。

首先要检查的是pg_stat_activity 中所有内容的当前状态。这包括最近的查询和事务状态。在连接泄漏中,您可能会发现大量具有类似查询的IDLE 连接。这些查询可以帮助您追踪连接泄漏。同样在连接泄漏中,当问题开始时,它会一直持续到您重新启动为止。

如果问题实际上是可用连接太少,那么您将看到大量 ACTIVE 连接。在这种情况下,增加池中的连接数。同样在这种情况下,问题将间歇性发生,然后似乎完全自行解决。

【讨论】:

以上是关于在配置的阻塞超时内没有可用的托管连接(JBoss 7 和 Postgres)的主要内容,如果未能解决你的问题,请参考以下文章

网络出现连接超时怎么解决?

redis BLPOP命令阻塞,非阻塞(读了好久才懂)

HTTP超时问题

谷歌云托管 - 连接超时后

tcpsocket/tmp很慢

jedis 连接超时后还需要关闭吗