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

24

定期出现错误:

ERROR JDBCExceptionReporter --> javax.resource.ResourceException: IJ000453: 无法获取java:jboss/datasources/myDB的托管连接 08:12:05,928 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/mySoftware].[jsp]] (ajp--xx.255.0.yyy-8109-21) Servlet.service() for servlet jsp threw exception: javax.resource.ResourceException: IJ000655: 已超过配置的阻塞超时时间(30000[毫秒]),无可用的托管连接。 at 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服务器中,我允许最大连接数为500。为什么会出现这个异常?


1
好像连接池中的所有托管连接都在使用?30000 [毫秒] 的延迟相当巨大。我会检查一下在使用后您是否正确释放了连接,数据库上的平均事务需要多长时间,以及当然有多少线程正在并发获取连接。 - Andrzej Łach
你遇到这个问题是因为你达到了应用服务器配置的150个连接的限制。你是如何与这些连接交互的?使用普通的JDBC还是JPA? - John Ament
我使用的是 Hibernate 3.6.2 应用程序,在 postgres 服务器上使用一个数据库。每两天我的应用程序会写入“无法获取 java:jboss/datasources/myDB 的托管连接 08:12:05,928 错误",通常情况下两个应用程序的 "max" 可以使用 250 个连接到数据库。我有 500 个连接但仍然出现错误。此外,我通过 pgadmin 创建了“统计服务器”报告,并发现许多连接的状态为“提交”,并且它们一直保持着这种状态。 - Benjamin
1
这个问题解决了吗?如果是,怎么解决的? - Usha
1
我也遇到同样的问题,有人对此有任何建议吗?谢谢。 - Wasif Tanveer
1个回答

8
您的主要问题可能是连接泄漏,但也可能不是。换句话说,数据库事务正在离开池并未被返回。在这种情况下,由于问题可能是代码问题而不是数据库问题,因此有一些具体的事情需要开始处理。
首先要检查的是pg_stat_activity中所有内容的当前状态。这包括最近的查询和事务状态。在连接泄漏中,您可能会发现大量相似查询的IDLE连接。查询可以帮助您跟踪连接泄漏。此外,在连接泄漏中,当问题开始时,它将持续到您重新启动为止。
如果问题实际上是可用连接太少,则会看到大量ACTIVE连接。在这种情况下,请增加池中的连接数。此外,在这种情况下,问题将间歇性地出现,然后似乎自行解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接