EHCache本地TransactionManager删除时超时

时间:2018-07-06 19:22:58

标签: java caching transactions ehcache

我正在一个项目中并入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)

我注意到,如果我做任何涉及在现有键上放置或移除的操作,都会遇到此问题。我知道事务管理器在开始和提交之间的键上设置了锁定,并且事务管理器的线程有时在并发环境中有时会超时,但是我不确定如果对任何对象都持有对象键的锁定,我该如何使用事务管理器严重的时间段。

0 个答案:

没有答案