Dead Lock с JBoss Cache 1.4.1 - PullRequest
       33

Dead Lock с JBoss Cache 1.4.1

1 голос
/ 14 декабря 2011

Я использую: JBoss AS 4.2.3, JBoss Cache 1.4.1 SP12, Hibernate 3.2.6;JPA 1.0.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 (org.jboss.cache.lock.LockStrategyReadCommitted@63b596)
....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 или проблема с моим приложением?Что я делаю не так?Все транзакции управляются контейнером ...

1 Ответ

0 голосов
/ 13 февраля 2013

Попробуйте сначала очистить кеш, удалив физический файл или программно. Если нет, попробуйте использовать <attribute name="NodeLockingScheme">MVCC</attribute>. Оптимистическая и пессимистическая схемы блокировки все равно не рекомендуются.

...