我正在一个项目中并入ehCache。目前,我正在编写JUnit测试以测试各种行为。添加事务管理器时,我开始看到某些呼叫的超时问题。
当前使用eHcache 2.10.5,但也尝试了2.8.4 以下是我的xml
<cache name="ehCache_1"
maxElementsInMemory="20"
eternal="false"
overflowToDisk="false"
timeToLiveSeconds="50"
timeToIdleSeconds="10"
transactionalMode="local">
下面是我的JUnit
@Test
public void testEHCacheIssue(){
try{
Ehcache ehCache_1 = ehCacheManager.getCache("ehCache_1");
transactionManager = ehCacheManager.getTransactionController();
transactionManager.setDefaultTransactionTimeout(15);
transactionManager.begin();
ehCache_1.put(new Element("1", new TestElementPerson(1, "firstName1", "lastName1","email1@test.com",1234)));
transactionManager.commit();
transactionManager.begin();
ehCache_1.put(new Element("2", new TestElementPerson(2, "firstName3", "lastName3","email3@test.com",1234)));
transactionManager.commit();
transactionManager.begin();
ehCache_1.get("1");
transactionManager.commit();
transactionManager.begin();
ehCache_1.remove("1");//Timeout happens here
transactionManager.commit();
}catch(Exception ex){
LOGGER.error("There was an exception", ex);
Assert.fail();
}
}
在删除时抛出以下错误:
有一个例外
net.sf.ehcache.transaction.TransactionTimeoutException:事务 [3]在 net.sf.ehcache.transaction.local.LocalTransactionStore.assertNotTimedOut(LocalTransactionStore.java:108) 在 net.sf.ehcache.transaction.local.LocalTransactionStore.remove(LocalTransactionStore.java:391) 在 net.sf.ehcache.store.AbstractCopyingCacheStore.remove(AbstractCopyingCacheStore.java:110) 在 net.sf.ehcache.store.TxCopyingCacheStore.remove(TxCopyingCacheStore.java:33) 在net.sf.ehcache.Cache.removeInternal(Cache.java:2426)在 net.sf.ehcache.Cache.remove(Cache.java:2331)位于 net.sf.ehcache.Cache.remove(Cache.java:2249)在 net.sf.ehcache.Cache.remove(Cache.java:2227)
我注意到,如果我做任何涉及在现有键上放置或移除的操作,都会遇到此问题。我知道事务管理器在开始和提交之间的键上设置了锁定,并且事务管理器的线程有时在并发环境中有时会超时,但是我不确定如果对任何对象都持有对象键的锁定,我该如何使用事务管理器严重的时间段。