Проблемы с блокировкой с помощью SimpleReadWriteEJBLock
-
22-09-2019 - |
Вопрос
Прежде всего, я использую Oracle и JBoss 4.0.4, и я в значительной степени новичок в вопросах JBoss.
Наше распределенное приложение использует CMP-компоненты с SimpleReadWrite...политика блокировки etc, которая, как мне сказали, казалась лучшим выбором в то время.(Оригинальные разработчики больше не работают с нами, и я не могу легко получить от них обратную связь, не говоря уже о полном отсутствии документации).
Соответствующая конфигурация выглядит следующим образом:
<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...
Время ожидания транзакции истекает и впоследствии блокирует все остальные транзакции от любого другого пользователя в заблокированных таблицах.Каждый раз, когда это происходит, мы должны сбросить службы или завершить заблокированный сеанс базы данных...или надеяться, что проблема решится сама собой (иногда блокировка снимается в считанные секунды).
Что могло быть не так?Более конкретный вопрос заключается в том, почему транзакция с истекшим временем ожидания в конечном итоге блокирует ресурс вместо того, чтобы быть спокойно откатанной?Любая помощь приветствуется.
Решение
Это выглядит так ошибка в jboss 4.0.
Другие советы
Я забыл включить соответствующие детали из исходной конфигурации:
<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>