1

Я использую: 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, или проблема с моим приложением? Что я делаю неправильно? Все транзакции, управляемые контейнером ...

+1

Вы используете поставщик кэшей, предложенный в http://galder.zamarreno.com/?p=56, который был позже обновлен в http://galder.zamarreno.com/?p=227? См. Http://community.jboss.org/wiki/NewJBossCache14xBasedHibernate32CacheProvider для получения дополнительной информации. Этот поставщик кэшей предназначен для предотвращения проблем с блокировкой. –

+0

https://community.jboss.org/wiki/NewJBossCache14xBasedHibernate32CacheProvider – Vadzim

ответ

0

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