一些关系数据库表由驻留在进程中的单个对象缓存管理。提交缓存时,表将更新。数据库关系表是通过常规SQL查询更新的,而不是像hibernate那样更高级的。
最终,其他进程开始修改此对象而不相互通信,即每个进程将初始化此对象(从DB读取)并更新它(提交到DB),&其他进程不会知道它持有过时的缓存。
我必须修复此工作流程。我想过几种方法。 一种是使这个对象成为一个mBean。因此,对象将驻留在一个进程上,每个进程最终将通过mBean方法调用修改该进程中的对象。
但是,这种方法存在一些问题。 1)此缓存返回的每个对象都是一个mBean,这可能使方法调用非常繁琐。 2)还要求每个进程都应该看到DB的一致数据模型(缓存),并且如果可能的话应该将其内容合并到数据库中。 (像交易一样)。如果数据库由其他进程显着更新,则合并失败即可。
Java中的哪些技术有助于解决这个问题?
答案 0 :(得分:3)
你应该看看Terracotta。他们拥有使多个JVM(可以在不同服务器上)看起来统一的技术。如果更新一个JVM上的对象,Terracotta将以安全的方式在集群中的所有JVM上透明地更新实例。
答案 1 :(得分:0)
如果您想保留对象模型,可以在提交之前使用java object cache进行集中存储。或者您可以使用zookeeper保留共享锁。
但听起来你应该放弃自我管理的缓存。使用您提到的hibernate或其他JPA实施。 JPA解决了缓存问题并维护了L2共享缓存,因此他们已经为您考虑过这个问题。
答案 2 :(得分:0)
我同意John - 在hibernate中使用二级缓存并支持群集。通过使用简化的数据访问模型管理数据的更直接的方法,让Hibernate管理细节。
Terracotta Ehcache是一个这样的缓存,JBoss,Coherence等也是如此。
关于Hibernate Second Level Cache can be had here和in the official Hibernate docs on Chapter 19. Improving Performance的更多信息(请注意,当Hibernate文档列出二级缓存提供程序时,该列表已经过时了,例如谁使用Swarm Cache?最后一个版本那是在2003年)