代码之家  ›  专栏  ›  技术社区  ›  Ittai

EHCache是否需要put()才能反映对实例的更改(XA)?

  •  4
  • Ittai  · 技术社区  · 15 年前


    我已经开始使用EHCache作为JTA用户事务中的事务缓存(XAResource),我看到了一些奇怪的事情,至少在我的脑海中是这样,我想知道我的“看到”是错的还是我的理解。
    以下代码将返回 false

    ut = getUserTransaction();
    ut.begin();
    MyClass a = myChache.get(key).getValue();
    a.changeSomeInnerReferrence(newRefference);
    ut.commit();
    ut = getUserTransaction();
    ut.begin();
    MyClass b = myChache.get(key).getValue();
    ut.commit();
    return a.equals(b);
    

    我们假设 MyClass 具有该类型的成员 MyOtherClass 还有那个 changeSomeInnerReferrence 将引用从当前值更改为参数;还假设equals考虑了该成员。
    我注意到除非我加上 myChache.put(key,a) ut.commit() 上面的代码将返回 .

    为什么?这是缓存的一般行为吗?我认为一旦调用commit,更改内部引用就会传播到缓存中。

    谢谢,
    伊泰

    1 回复  |  直到 15 年前
        1
  •  2
  •   sharakan    15 年前

    这里有点前言,我没有在JTA的上下文中使用EHCache。它有可能在用户事务中做一些聪明的事情,但我有点怀疑。

    一般规则是cache.get(key)返回的元素是按值的。对它的更改不一定反映在底层缓存中。如果你想象一下根本没有内存存储,而只有磁盘存储,那么它背后的原因就变得非常清楚了。磁盘存储需要序列化缓存条目,因此put/get操作对将返回另一个Java实例。此外,在这种情况下,还不清楚cache.get()返回的实例的任何更改何时会/何时应该写回磁盘。使用put()可以清楚地说明这一点。

    最后,从get()得到的东西是您的责任。你告诉EHCache说put()来接管。