java.sql.SQLException:无法在60秒内获得锁定

时间:2011-07-04 08:57:26

标签: hibernate jdbc oracle10g seam jboss5.x

我现在正在跟踪这个错误一段时间,它在不规则的基础上无法预测,我现在还没有办法重现它。

我们的环境

  • linux centos 5.3托管一个jboss 5.1 app服务器
  • linux centos 5.3托管一个oracle 10g XE db
  • windows server 2003 R2托管另一个oracle 10g XE db

编程环境

  • seam 2.1
  • hibernate
  • JSF 1.2

大多数错误发生在“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)

1 个答案:

答案 0 :(得分:1)

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

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

您还应该查看数据库的配置文件,也许您可​​以在那里调整一些设置。例如,wait_timeoutmax_connections等。特别是您可以考虑增加后者。 也许你有很多空闲的sql连接没有做任何事情,当到达池时,它会等到达到一个,然后你得到这个例外?

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