2009-12-21 45 views
2

一对关系数据库表由驻留在进程中的单个对象高速缓存管理。当提交缓存时,表被更新。 DB关系表通过常规SQL查询进行更新,而不像休眠那样更有趣。最后,其他进程进入了修改这个对象而不相互通信的业务,即,每个进程都会初始化这个对象(从DB读取)并更新它(提交给DB),其他进程不会知道它坚持一个陈旧的缓存。用java中的多个进程更新单个对象

我必须解决这个工作流程。我想到了几种方法。 一个是让这个对象成为mBean。所以,对象将驻留在一个进程上,每个进程最终都会通过mBean方法调用修改该进程中的对象。

但是,这种方法存在一些问题。 1)这个缓存返回的每个对象都是一个mBean,这可能会使方法调用相当健谈。 2)此外还要求每个进程都应该看到数据库的一致数据模型(缓存),并且如果可能的话,它应该将其内容合并到数据库中。 (如交易)。如果数据库被其他某个进程显着更新,则合并失败即可。

Java中的哪些技术有助于解决此问题?

回答

3

你应该看看Terracotta。他们拥有使多个JVM(可以位于不同服务器上)看起来统一的技术。如果您在一个JVM上更新对象,Terracotta会以安全的方式在集群中的所有JVM上透明地更新实例。

+0

让我问你这个。记忆足迹是什么?兵马俑是否会在多个JVM中维护对象的多个副本?并同步更新它们?还是会保留一个副本,并让他们拥有自己的副本的不同流程产生幻想? – 2010-03-16 19:59:17

+0

@Random Dude:我当然不知道答案。我与Terracotta的经历仅限于在圣地亚哥Java用户组的一位兵马俑看到一个2小时的演讲。我怀疑Terracotta可能会将整个对象图保存在集群中每个JVM的内存中,并将更改代理到其他JVM。但是,我不能100%确定这一点。也许直接与兵马俑的人在一起。 – Asaph 2010-03-17 02:52:48

0

如果您想保留对象模型,您可以在提交之前使用java object cache进行集中存储。或者您可以使用zookeeper保留共享锁。

但它听起来像你应该放弃自我管理的缓存。使用hibernate或其他JPA实现,您提到。 JPA解决缓存问题并维护L2共享缓存,所以他们已经为你考虑过这个问题。

0

我同意约翰 - 在hibernate中使用第二级缓存,支持聚类。通过使用简化的数据访问模型来管理数据并让Hibernate管理细节的方式更直接。

兵马俑的Ehcache是​​一个这样的高速缓存,所以是JBoss的,连贯性等

Hibernate Second Level Cache can be had herein the official Hibernate docs on Chapter 19. Improving Performance

更多信息(注意,而在Hibernate文档的确列出了二级缓存的提供者,名单是远远超出日期,例如谁使用Swarm Cache?最后一个版本是在2003年)