这个问题可能听起来含糊不清,但我试图理解EHCache交易能力的一般概念
假设我将EHCache配置为内存缓存,我还将其配置为缓存MyObject
EHCache是否克隆了MyObject
的实例我是否正在检索这是否作为事务的一部分完成?
我主要是因为我被告知(在我的question的答案中)使用EHCache并且我担心它对性能的影响。 MyObject
是一个中等重量的物体,我不想不必要地复制它
另外,为了验证,EHCache只在交易时阻止写入对象,对吧?
谢谢,
以太
答案 0 :(得分:2)
我认为关于JTA支持的文档的以下部分回答了您的大部分问题:
使用JTA缓存
全部或全无
如果为所有JTA启用了缓存 对它的操作必须在一个 交易上下文,否则一个
TransactionRequiredException
将是。{ 抛出。更改可见性
Ehcache提供的隔离级别 JTA是
READ_COMMITTED
。 Ehcache是一个XAResource
。完全两阶段提交是 支撑。具体做法是:
- 对缓存的所有变更都是事务性的,包括
put
,remove
,putWithWriter
,removeWithWriter
和removeAll
。- 在群集中或群集中的本地JVM中看不到变更更改 直到
COMMIT
被调用。- 在此之前,请阅读
cache.get(...)
之类的其他交易 将返回旧副本。 读取不 块即可。后写和直写
如果正在使用启用了XA的缓存 与作家,写操作会 排队直到事务提交 时间。只是一种直写法 会有其潜在的XAResource 参与同一笔交易。 后备,虽然支持,但应该 可能不会与XA一起使用 事务缓存,作为操作 永远不会成为同一个人的一部分 交易。你的作家也会 负责获得新的 交易...
使用非XA的直写 资源也可以,但有 不保证交易会 写入操作后成功 已成功执行。在 另一方面,任何抛出的异常 在这些写操作期间会 导致事务被滚动 回来了
UserTransaction.commit()
抛出一个RollbackException
。
关于表演,我不会太担心,除非你的对象重量为几百MB。但如果这真的是一个问题,那么衡量事情(一如既往)。