我们已经创建了一个缓层到我们的J2EE的应用程序。在该实例中,我们使用拖.这造成了一些挑战。

让我们采取这个例子。

OrderItem orderitem = cache.getOrderItemByID("id");
OrderItem old_orderitem = cache.getOrderItemID("id");

orderitem.setStatus(1);
old_orderitem.setStatus(2);

如果我们不小心,作出的任何改动的那些对象将影响其它(他们的参考相同的对象)。节省orderitem回dabase将使它有status=2

我们将如何解决这个的最好方式?

我们已经尝试制作一个.等()方法对每个对象。这只是创建一个新的对象和设置的所有价值观。但是,这似乎不是一个很好的解决方案。

该示例只是为了说明。代码是远远比这更复杂,但结果是一样的。

**********************更新15.07.2010 **************************************************

在拖2有一些选项,以开copyRead()与版权().这解决了我所有的问题:)

有帮助吗?

解决方案

这是一个问题的可变的状态。它不仅仅是缓存,这是任何时间你可以有多种参考文献相同的对象,对象是可变的。例如:

HashMap map = new HashMap();
map.put("one", new OrderItem());
OrderItem one = map.get("one");
OrderItem two = map.get("one");
one.setStatus(1);
two.setStatus(2);

将有完全同样的问题。这变得更加复杂,当你有一个并发的环境。一种方法来解决这个是只有一成不变的对象。这样,如果你想要一个对象有不同的状态,你要使一个新的。这也使得并行程更容易。

你是对的,要考虑复制的对象。你的选择是:

每个人都有自己的优势和弱点,这一工作最好将取决于您的环境。

其他提示

听起来好像要缓存代表对象的数据(例如,数据库查询的结果),而不是一个对象本身(例如,用于用户会话数据,你可能想要检索其他地方)。

如果是这样的话,您的自定义cacheing层(周围的Ehcache)需要建立从缓存中数据的对象,当用户发出请求 - 每次都是这样会给你一个唯一的对象,你不会得到物体干扰

当您通过ID(getOrderItemById)从缓存中检索我认为是指“获得对象的唯一的由id标识=?”。在你的第二个摘录你已经(或正在尝试呢?)2个不同的对象,所以它看起来有点像你正在试图做2个矛盾的东西在代码中。

您可以强制唯一-ID =“ID”始终是相同的对象。如果设置的状态,然后重新设置,这意味着相同的对象有新的状态。你可能会想延长.equals方法返回true,如果ID也匹配。

您也可以使用“脏”标志来标记已经从(事务?)数据存储更改的对象。

制作副本不是一个坏的方式要么解决这个问题,但目前还不清楚这意味着什么有相同的id乱跑2级的对象。也许副本应与空ID创建以表明它不会在缓存中存在了吗?

什么是为您的应用正确的行为?

的Ehcache用于经由显式锁定API锁定键提供支持。您可以在与读写锁缓存中的钥匙将其锁定。这不会锁定在高速缓存中的值,所以对象仍然是开放的,以突变如果程序员如此决定。

这可能会或可能不会解决你别说,这取决于你怎么看这个问题。如果程序员wiling到进行惩罚,仅用于读的目的使用了读获取对象和修改+更新高速缓存上的键与取得写锁定对象时,那么这应该工作。

然而,可变状态的问题,因为杰米mccrindle提到,不会消失。

参考: http://ehcache.org/documentation/explicitlocking.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top