【问题标题】:How does EHCache implement its transactions?EHCache 如何实现其事务?
【发布时间】:2010-10-19 18:38:27
【问题描述】:

这个问题可能听起来很模糊,但我正在尝试理解 EHCache 事务能力的一般概念。
假设我将 EHCache 配置为内存缓存,并且我还将它配置为缓存 MyObject
如果这是作为事务的一部分完成的,EHCache 是否会克隆 MyObject 我正在检索的实例?

我主要是因为有人建议我(在我的question 的回答中)使用 EHCache,但我担心它会影响性能。 MyObject 是一个中等重量的对象,我不想不必要地复制它。
另外,只是为了验证一下,EHCache 只会在事务中阻止写入对象,对吧?

谢谢,
伊泰

【问题讨论】:

    标签: java performance transactions ehcache


    【解决方案1】:

    我认为有关JTA 支持的文档的以下部分回答了您的大部分问题:

    使用 JTA 缓存

    全有或全无

    如果为 JTA all 启用缓存 对它的操作必须在一个 事务上下文,否则为 TransactionRequiredException 将是 扔了。

    更改可见性

    Ehcache 提供的隔离级别 JTA 是READ_COMMITTED。 Ehcache 是一个 XAResource。完整的两阶段提交是 支持。

    具体来说:

    • 对缓存的所有变异更改都是事务性的,包括putremove, putWithWriter, removeWithWriterremoveAll
    • 在本地 JVM 中对集群或跨集群不可见变异更改 直到 COMMIT 被调用。
    • 在那之前,通过其他事务读取诸如cache.get(...) 将返回旧副本。 读取不 阻止

    后写和直写

    如果正在使用启用 XA 的缓存 与作家,写操作将 排队直到事务提交 时间。仅采用直写方式 将有其潜在的 XAResource 参与同一笔交易。 后写,虽然支持,但应该 可能不与 XA 一起使用 事务缓存,作为操作 永远不会是同一个的一部分 交易。你的作家也将是 负责获得新的 交易...

    对非 XA 使用直写 资源也可以,但是有 不保证交易会 写操作成功后有 已成功执行。在 另一方面,任何抛出的异常 在这些写操作期间 导致事务滚动 回来 UserTransaction.commit()扔一个 RollbackException.

    关于性能,除非您的对象重达数百 MB,否则我不会太担心。但是,如果这确实是一个问题,请测量(一如既往)。

    【讨论】:

    • 我猜 EHCache 究竟是如何将它归入“不是我的核心业务”的范畴,这就是我将其外包的原因,所以这是可用的最佳答案。谢谢。
    • @Ittai 好吧,我绝对倾向于同意这一点,这也是我最初建议使用现有解决方案的原因。以防万一您想降低,来源可用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多