Проблемы с блокировкой с использованием SimpleReadWriteEJBLock - PullRequest
1 голос
/ 25 января 2010

Прежде всего, я использую Oracle и JBoss 4.0.4, и я в значительной степени новичок в вопросах JBoss.

Наше распределенное приложение использует CMP-бины с политикой блокировки SimpleReadWrite ... и т. Д., Как мне сказали, в то время казалось лучшим выбором. (Разработчики оригиналов больше не работают с нами, и я не могу легко получить от них обратную связь, не говоря уже о полном отсутствии документации).

Соответствующая конфигурация выглядит следующим образом:

<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...

Время транзакции истекает, а затем блокируется каждая другая транзакция от любого другого пользователя для заблокированных таблиц. Каждый раз, когда это происходит, нам приходится сбрасывать службы или завершать сеанс заблокированной БД ... или надеяться, что проблема решится сама (иногда блокировка снимается в считанные секунды).

Что может быть не так? Более конкретный вопрос: почему тайм-аут транзакции блокирует ресурс вместо того, чтобы его можно было спокойно откатить? Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 29 января 2010

Это выглядит как ошибка в jboss 4.0 .

0 голосов
/ 25 января 2010

Я забыл включить соответствующие детали из исходной конфигурации:

<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>
...