Я использую: JBoss AS 4.2.3, JBoss Cache 1.4.1 SP12, Hibernate 3.2.6; JPA 1.0.1 сМертвый замок с кешем JBoss 1.4.1
<attribute name="NodeLockingScheme">PESSIMISTIC</attribute>
<attribute name="IsolationLevel">READ_COMMITTED</attribute>
и
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_structured_entries" value="true"/>
<property name="hibernate.cache.usage" value="transactional"/>
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.TreeCacheProvider"/>
<property name="hibernate.treecache.local_puts_only" value="true"/>
<property name="hibernate.treecache.querycache.local_writes_only" value="true"/>
настроек;
У меня есть такая сущность:
@Entity
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL, region = "AccountCache")
public class Account {
...some fields and methods...
}
и
@Entity
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class User {
....
@ManyToOne
private Account account;
....
}
Итак, у меня есть таймер службы, которые получают информацию о Account
и сделать некоторые вещи (не менять Account
, просто получить, и изменить какой-то другой объект). Когда пользователь логгирует и работает на страницах (страницы переключателей, делайте что-то в нем (не изменяйте Account
или User
объект)), и когда в этот момент запускается работа таймера, заблокирована страница пользователя и после 15 секундной ошибки:
....many lines of stack and such errors...
Error performing load command
org.hibernate.cache.CacheException: org.jboss.cache.lock.TimeoutException:
failure acquiring lock: fqn=/default/AccountCache,
caller=Thread[http-192.0.2.58-80-6,5,jboss], lock=write
owner=GlobalTransaction:<null>:88 ([email protected])
....many lines of stack and such errors...
Кажется, что GlobalTransaction:<null>:88
является пользователем tx, а caller
является timer service
.
Обычно пользовательская нить работает нормально, менее 15 секунд. Если отключить @Cache
в Account
все работа хорошо (похоже).
Если включить Optimistic
схему блокировки, в то же параллелизм (несколько раз) бросает такую ошибку:
Caused by: org.jboss.cache.optimistic.DataVersioningException:
Tx attempted to create /default/AccountCache/com.****.entity.account.Account#1 anew.
It has already been created since this tx started by another (possibly remote) tx.
И вопрос))) В чем проблема? Проблема TreeCache
, или проблема с моим приложением? Что я делаю неправильно? Все транзакции, управляемые контейнером ...
Вы используете поставщик кэшей, предложенный в http://galder.zamarreno.com/?p=56, который был позже обновлен в http://galder.zamarreno.com/?p=227? См. Http://community.jboss.org/wiki/NewJBossCache14xBasedHibernate32CacheProvider для получения дополнительной информации. Этот поставщик кэшей предназначен для предотвращения проблем с блокировкой. –
https://community.jboss.org/wiki/NewJBossCache14xBasedHibernate32CacheProvider – Vadzim