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