我现在正在跟踪这个错误一段时间,它在不规则的基础上无法预测,我现在还没有办法重现它。
我们的环境
编程环境
大多数错误发生在“APPLICATION”范围接缝组件上,但它也发生在其他地方。
我们正在使用XA-datasource来访问数据库。
它显示tis也是jboss 5.1 look here中的某种错误,但我们没有持续60秒的查询或请求。
这种错误的可能原因是什么?
错误的最终堆栈跟踪:
Caused by: java.sql.SQLException: Unable to obtain lock in 60 seconds: org.jboss.resource.adapter.jdbc.xa.XAManagedConnection@1d314d
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.tryLock(BaseWrapperManagedConnection.java:267)
at org.jboss.resource.adapter.jdbc.WrappedConnection.lock(WrappedConnection.java:79)
at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:237)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573)
at org.hibernate.loader.Loader.doQuery(Loader.java:696)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2228)
答案 0 :(得分:1)
您可以在app-ds.xml文件中执行一些操作。如果你有一个? 例如,如果您正在运行mysql,则可以编写
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
您还应该查看数据库的配置文件,也许您可以在那里调整一些设置。例如,wait_timeout
,max_connections
等。特别是您可以考虑增加后者。
也许你有很多空闲的sql连接没有做任何事情,当到达池时,它会等到达到一个,然后你得到这个例外?
还要记住Application stroped组件是线程安全的。因此,请确保尽可能限制应用程序范围的组件和会话组件。 最好在适用的地方使用事件和对话范围组件。