【问题标题】:Locking problems using SimpleReadWriteEJBLock使用 SimpleReadWriteEJBLock 锁定问题
【发布时间】:2010-01-25 15:59:30
【问题描述】:

首先,我使用的是 Oracle 和 JBoss 4.0.4,而且在 JBoss 方面我几乎是新手。

我们的分布式应用程序使用带有 SimpleReadWrite... 等锁定策略的 CMP bean,据我所知,这在当时似乎是最佳选择。 (原始开发人员不再与我们合作,我无法轻易从他们那里获得反馈,更不用说完全缺乏文档了)。

相关配置如下:

<container-configuration extends="Standard CMP 2.x EntityBean with cache invalidation">
  <container-name>Standard CMP 2.x EntityBean</container-name>
  <locking-policy>org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock</locking-policy>
  <container-cache-conf>
    <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
    <cache-policy-conf>
      <min-capacity>150</min-capacity>
      <max-capacity>1000000</max-capacity>
      <overager-period>600</overager-period>
      <max-bean-age>1800</max-bean-age>
      <resizer-period>400</resizer-period>
      <max-cache-miss-period>60</max-cache-miss-period>
      <min-cache-miss-period>1</min-cache-miss-period>
      <cache-load-factor>0.75</cache-load-factor>
    </cache-policy-conf>
  </container-cache-conf>
  <container-pool-conf>
    <MaximumSize>1000</MaximumSize>
  </container-pool-conf>
  <cache-invalidation>true</cache-invalidation>
</container-configuration>

从清晨到晚上 9 点至晚上 10 点,每天都使用该应用程序,包括周末。有时(例如每月两次)我们会遇到这种错误:

2010-01-25 13:41:10,567 WARN  [org.jboss.tm.TransactionImpl] Transaction TransactionImpl:XidImpl[FormatId=257, GlobalId=anemosa1/3531484, BranchQual=, localId=3531484] timed out. status=STATUS_ACTIVE
2010-01-25 13:41:14,225 ERROR [org.jboss.ejb.plugins.LogInterceptor] TransactionRolledbackLocalException in method: public abstract java.lang.Long org.anemos.ejb.dictionary.LongId.getId(), causedBy:
javax.ejb.EJBException: Transaction marked for rollback - probably a timeout.
 at org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock.checkTransaction(SimpleReadWriteEJBLock.java:340)
 at org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock.waitAWhile(SimpleReadWriteEJBLock.java:219)
 at org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock.getReadLock(SimpleReadWriteEJBLock.java:153)
...many more lines...

一个事务超时并随后在锁定的表上锁定所有其他用户的所有其他事务。每次发生这种情况时,我们都必须重置服务或终止锁定的数据库会话......或者希望问题能够自行解决(有时锁定会在几秒钟内解除)。

可能出了什么问题?一个更具体的问题是,为什么超时事务最终会锁定资源而不是被悄悄回滚?任何帮助表示赞赏。

【问题讨论】:

    标签: java locking ejb-2.x jboss-4.0.x


    【解决方案1】:

    这看起来是a bug in jboss 4.0

    【讨论】:

      【解决方案2】:

      我忘了包括原始配置中的相关部分:

      <container-configuration>
        <container-name>Standard CMP 2.x EntityBean with cache invalidation</container-name>
        <call-logging>false</call-logging>
        <invoker-proxy-binding-name>entity-rmi-invoker</invoker-proxy-binding-name>
        <container-interceptors>
              ...      
        </container-interceptors>
        <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
        <instance-cache>org.jboss.ejb.plugins.InvalidableEntityInstanceCache</instance-cache>
        <persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
        <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
        <container-cache-conf>
              ...      
        </container-cache-conf>
        <container-pool-conf>
          <MaximumSize>100</MaximumSize>
        </container-pool-conf>
        <commit-option>A</commit-option>
      </container-configuration>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多