我正在尝试使用Ehcache进行XA交易。目前我正在使用Spring事务管理和Bitronix作为事务管理器。
我使用以下方法创建,配置和填充缓存:
@Transactional
public void createCache() {
this.cacheConfiguration = new CacheConfiguration("MyCache", 5000).diskPersistent(false).eternal(false)
.diskExpiryThreadIntervalSeconds(1).maxElementsInMemory(70).transactionalMode(TransactionalMode.XA);
final Configuration config = new Configuration();
config.setDefaultCacheConfiguration(this.cacheConfiguration);
final DiskStoreConfiguration diskStoreConfiguration = new DiskStoreConfiguration();
diskStoreConfiguration.setPath("cache");
config.addDiskStore(diskStoreConfiguration);
this.cacheManager = new CacheManager(config);
this.cacheConfiguration.name("primaryCache");
this.cache = new Cache(this.cacheConfiguration);
this.cacheManager.addCache(this.cache);
for (int i = 0; i < 100; i++) {
final Integer value = Integer.valueOf(i);
this.cache.put(new Element(value, value));
}
}
一切都运转良好,Ehcache按照预期的70个被驱逐的元素工作。
现在,如果我将diskPersistent
从false
更改为true
,则只要Ehcache尝试将某些元素复制到磁盘存储中,它就会无效,但会出现以下异常:
[primaryCache.data] ERROR n.s.e.s.c.f.DiskStorageFactory btm-gtrid=737072696E672D62746D0000012F9296448C00000000 - Disk Write of 0 failed (it will be evicted instead):
java.io.NotSerializableException: net.sf.ehcache.transaction.ReadCommittedSoftLockImpl
这是预期,因为将Ehcache切换到事务模式会使Integer
类型的原始值替换为SoftLock
:
[main] DEBUG n.s.e.t.local.LocalTransactionStore ehcache-txid=0, btm-gtrid=737072696E672D62746D0000012F9296448C00000000 - put: cache [primaryCache] key [0] was not in, soft lock inserted
完成后,使用Atomikos事务管理器时也会发生这种情况,并且在不使用XA模式时可以正常工作。
问题是:有没有办法混合XA事务和磁盘溢出?
答案 0 :(得分:2)
一切都应该像你期望的那样工作,但你刚刚发现了一个错误,它完全阻止了开源磁盘持久存储使用任何事务模式。
请在Ehcache JIRA(https://jira.terracotta.org/jira/browse/EHC)中报告问题,我们会尽快解决。