我已经跟踪了一段时间,它在不规则的情况下无法预测地发生,并且我暂时还没有找到一种方法来重现它。

我们的环境


linux centos 5.3托管一台jboss 5.1应用服务器
Linux centos 5.3托管一个Oracle 10g XE数据库
Windows Server 2003 R2托管另一个Oracle 10g XE数据库


编程环境


接缝2.1
冬眠的
JSF 1.2


大多数此类错误发生在“ APPLICATION”范围接缝组件上,但也发生在其他位置。

Wea正在使用XA数据源访问数据库。

看来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)

最佳答案

您可以在app-ds.xml文件中执行一些技巧。如果您有一个是?
例如,如果您正在运行mysql,则可以编写

<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>


您还应该查看数据库的配置文件,也许您可​​以在那里调整一些设置。例如,wait_timeoutmax_connections等。尤其是可以考虑增加后者。
也许您有许多不执行任何操作的空闲sql连接,并且在到达池时,它将等待直到到达一个池,然后您才收到此异常?

还请记住,应用程序范围的组件是线程安全的。因此,请确保尽可能限制应用程序范围的组件和会话组件。
如果适用,最好使用事件和对话范围的组件。

07-24 13:09