jboss wildfly 数据源连接失败 - 在配置的阻塞超时内没有可用的托管连接
Posted
技术标签:
【中文标题】jboss wildfly 数据源连接失败 - 在配置的阻塞超时内没有可用的托管连接【英文标题】:jboss wildfly datasource connection failing - No managed connections available within configured blocking timeout 【发布时间】:2015-03-28 13:30:12 【问题描述】:我有一个 jboss wildfly 服务器通过应用服务器上配置的数据源连接到 mysql 数据库。
有一段时间无法访问 mysql 数据库(网络问题等),当无法访问 mysql 时,我会在日志中收到以下消息:
09:42:30,015 ERROR [org.jboss.seam.async.AsynchronousExceptionHandler] (4pm_services_QuartzScheduler_Worker-4) Exception thrown whilst executing asynchronous call: java.
lang.RuntimeException: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
这是意料之中的,因为此时你的 mysql 不可用,问题是当 mysql 服务器再次联机时,错误仍然存在,并且 jboss 服务器无法从连接池中获取有效。
我有: 野蝇8.1 mysql 5.5 使用 JPA 与数据库通信
这里是数据源配置:
<datasource jta="true" jndi-name="java:jboss/services_DS" pool-name="fourPmDSServices" enabled="true" use-java-context="true">
<connection-url>jdbc:mysql://192.168.10.110:3306/FOUR_PM__SERVICES?useUnicode=true&characterEncoding=UTF-8</connection-url>
<driver>mysql</driver>
<new-connection-sql>select 1</new-connection-sql>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
<prefill>true</prefill>
<use-strict-min>false</use-strict-min>
</pool>
<security>
<user-name>*********</user-name>
<password>*********</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
<check-valid-connection-sql>select 1</check-valid-connection-sql>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
</validation>
<statement>
<prepared-statement-cache-size>10</prepared-statement-cache-size>
<share-prepared-statements>true</share-prepared-statements>
</statement>
</datasource>
这是错误的完整堆栈跟踪:
00:00:00,017 WARN [org.hibernate.util.JDBCExceptionReporter] (4pm_services_QuartzScheduler_Worker-2) SQL Error: 0, SQLState: null
00:00:00,018 ERROR [org.hibernate.util.JDBCExceptionReporter] (4pm_services_QuartzScheduler_Worker-2) javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/services_DS
00:00:00,018 ERROR [org.jboss.seam.async.AsynchronousExceptionHandler] (4pm_services_QuartzScheduler_Worker-2) Exception thrown whilst executing asynchronous call: java.lang.RuntimeException: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
at si.arctur.fourPmServices.scheduleJobs.QuartzJobBase.executeInternal(QuartzJobBase.java:91) [4pm_services-ejb.jar:]
at si.arctur.fourPmServices.scheduleJobs.QuartzJobBase.schedule(QuartzJobBase.java:76) [4pm_services-ejb.jar:]
at sun.reflect.GeneratedMethodAccessor98.invoke(Unknown Source) [:1.6.0_32]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.6.0_32]
at java.lang.reflect.Method.invoke(Method.java:622) [rt.jar:1.6.0_32]
at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:77) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.async.AsynchronousInterceptor.aroundInvoke(AsynchronousInterceptor.java:52) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103) [jboss-seam.jar:2.2.2.Final]
at si.arctur.fourPmServices.scheduleJobs.emailSender.MailChecker_$$_javassist_seam_2.schedule(MailChecker_$$_javassist_seam_2.java) [4pm_services-ejb.jar:]
at sun.reflect.GeneratedMethodAccessor104.invoke(Unknown Source) [:1.6.0_32]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.6.0_32]
at java.lang.reflect.Method.invoke(Method.java:622) [rt.jar:1.6.0_32]
at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.async.AsynchronousInvocation$1.process(AsynchronousInvocation.java:62) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.async.Asynchronous$ContextualAsynchronousRequest.run(Asynchronous.java:80) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.async.AsynchronousInvocation.execute(AsynchronousInvocation.java:44) [jboss-seam.jar:2.2.2.Final]
at org.jboss.seam.async.QuartzDispatcher$QuartzJob.execute(QuartzDispatcher.java:243) [jboss-seam.jar:2.2.2.Final]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [quartz.jar:1.6.0]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) [quartz.jar:1.6.0]
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1389) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1317) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255) [hibernate-core.jar:3.6.10.Final]
at si.arctur.fourPmServices.scheduleJobs.emailSender.MailChecker.checkQueue(MailChecker.java:37) [4pm_services-ejb.jar:]
at si.arctur.fourPmServices.scheduleJobs.emailSender.MailChecker.execute(MailChecker.java:26) [4pm_services-ejb.jar:]
at si.arctur.fourPmServices.scheduleJobs.QuartzJobBase$TransactionalWork.work(QuartzJobBase.java:144) [4pm_services-ejb.jar:]
at org.jboss.seam.util.Work.workInTransaction(Work.java:61) [jboss-seam.jar:2.2.2.Final]
at si.arctur.fourPmServices.scheduleJobs.QuartzJobBase.executeInternal(QuartzJobBase.java:89) [4pm_services-ejb.jar:]
... 30 more
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:801) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2542) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.Loader.list(Loader.java:2271) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246) [hibernate-core.jar:3.6.10.Final]
... 35 more
Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/services_DS
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:137)
at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:71) [hibernate-core.jar:3.6.10.Final]
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) [hibernate-core.jar:3.6.10.Final]
... 49 more
Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/services_DS
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:390)
at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:368)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:464)
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:129)
... 51 more
Caused by: javax.resource.ResourceException: IJ000655: No managed connections available within configured blocking timeout (30000 [ms])
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:377)
at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getTransactionNewConnection(AbstractPool.java:495)
at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:374)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:329)
... 54 more
【问题讨论】:
【参考方案1】:您似乎需要为失败的连接定义刷新策略。 检查“flush-strategy”参数。
这里是一个很好的起点: https://docs.jboss.org/author/display/WFLY8/DataSource+configuration
他们引用了这个 XSD: http://www.ironjacamar.org/doc/schema/datasources_1_1.xsd
XSD 说明在这里: http://www.ironjacamar.org/doc/userguide/1.2/en-US/html_single/index.html#deployingds
在您的情况下,我会尝试找出网络问题。 独立于此。我会在你的情况下(连接问题)刷新我的完整连接池: 刷新策略 => 整个池
祝你好运解决这样一个奇怪的问题
【讨论】:
tnx 的信息,我们怀疑它发生在应用服务器位置和数据库位置之间的 *** 失败时。不要问为什么中间有一个 *** :) 我们计划在未来合并这两个位置......无论如何,tnx 的信息看起来很有趣 不要忘记关于 *** 的赏金 ;-),也许我也可以提供帮助...最好是打开一个新问题并在那里提供 *** 详细信息。【参考方案2】:消息没有可用的托管连接是什么意思?
这意味着与数据库的所有可能连接都在使用中和/或线程已超时等待连接打开。
可能的解决方案:
增加连接池大小
添加
<max-pool-size>whatever</max-pool-size>
给你的-ds.xml文件增加
可用的连接数。默认为 20
有一个属性
MaxConnectionsInUse
可在 jmx 控制台上查看
托管连接池
这可以帮助您了解您真正需要多少连接。
告诉你的线程等待更长的时间来打开连接
添加
<blocking-timeout-millis>whatever</blocking-timeout-millis>
到您的-ds.xml 文件中增加等待时间。默认值为 30000(在 JBoss-3.2.4 之前为 5000)毫秒。
确保您正确关闭打开的连接
【讨论】:
Tnx 获取信息,我不需要该应用程序中的那么多连接,它通常只有一个用户。我还使用 EJB 容器的托管事务和 ORM 的休眠,所以我没有手动打开关闭连接。无论如何,我会尝试增加 max-pool-size 和blocking-timout-mills,我可能会有所帮助...tnx 再次获取信息 @simonC:增加连接池可能对你没有帮助。由于您已经打开了连接,这些连接正试图将连接恢复到数据库。所以它只会增加与服务器的打开连接数。 增加连接池只会填满无法到达数据库的新连接。一旦连接恢复,您的数据库将不得不做很多工作......我是一名管理员,并且会限制应用程序与数据库的并发线程/连接。所以这个问题在 jboss 方面会更成问题。【参考方案3】:我也遇到过这个问题。但是,我的连接短暂工作,然后在多次请求后停止工作。原来是一个未关闭的数据库连接,导致连接被消耗,最终耗尽连接池。简单地增加连接池大小只会延迟最终的错误。您需要确定未正确关闭连接的位置以解决此问题。
【讨论】:
【参考方案4】:standalone-ha.xml 中 JCA 中的 debug="true" error="true"
验证是否存在于 jca 子系统中并设置 debug="true"。 ... ... 然后在 server.log 中,如果任何连接没有通过代码的堆栈跟踪关闭,它将写入。
【讨论】:
【参考方案5】:我有一个类似的问题,我用@Harsh 所说的答案解决了这个问题。我将 maxpoolsize 从 20 增加到 100,问题就消失了。
【讨论】:
你在哪个文件中增加了 maxpoolsize?【参考方案6】:原因:javax.resource.ResourceException:IJ000655:在配置的阻塞超时(30000 [ms])内没有可用的托管连接
此消息表明,配置的池无法在配置的 3 秒(3000 毫秒)超时内提供任何连接。要么你的池太小,要么你的连接在使用后没有关闭,也许增加池的大小会起作用。
还要检查 JBoss 的连接是否关闭。
【讨论】:
当您使用 *** 时,我认为问题是网络通信失败。对于“jboss 服务器无法从连接池中获取有效”:- 当连接正常时,服务器的数据源池中维护了一些成功的连接。一旦此链接断开并尝试再次连接,此数据源将在分发之前验证现有的池连接。我认为这就是 Jboss 没有再次验证的原因。【参考方案7】:原因:javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/services_DS
似乎问题与某些数据库表和 java 配置有关,例如 hbm.xml。对于每个 Table Type 参数,java api 都会打开一个到数据库的连接或由于某些其他环境配置。
请参考以下链接,您将得到同样的解决方案。
https://developer.jboss.org/thread/211940
http://www.coderanch.com/t/556721/JBoss/Jboss-Datasource-configured-correctly-unable
【讨论】:
以上是关于jboss wildfly 数据源连接失败 - 在配置的阻塞超时内没有可用的托管连接的主要内容,如果未能解决你的问题,请参考以下文章
如何让 JBoss/WildFly 在应用程序部署/初始化失败时自动终止?
Wildfly 安全管理器:org.jboss.vfs.VirtualFilePermission 的权限失败
jboss-6.0.0.Final 与 wildfly-10.1.0.Final 中的每个用户数据源连接池(通过安全域)