在配置的阻塞超时内没有可用的托管连接(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)的主要内容,如果未能解决你的问题,请参考以下文章