【问题标题】:Update a single object across multiple process in java在java中跨多个进程更新单个对象
【发布时间】:2009-12-21 19:42:41
【问题描述】:

几个关系数据库表由驻留在进程中的单个对象缓存管理。当缓存被提交时,表被更新。 DB 关系表由常规 SQL 查询更新,而不是像 hibernate 这样更花哨的东西。

最终,其他进程在不相互通信的情况下进入了修改这个对象的业务,即每个进程都会初始化这个对象(从 DB 读取)并更新它(提交到 DB),而其他进程不会知道它保留陈旧的缓存。

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

但是,这种方法有几个问题。 1) 这个缓存返回的每个对象都是一个 mBean,这可能会使方法调用变得非常冗长。 2)还要求每个进程都应该看到数据库的一致数据模型(缓存),并且如果可能的话,它应该将其内容合并到数据库中。 (如交易)。如果数据库被其他进程显着更新,则合并失败是可以的。

Java 中有哪些技术可以帮助解决这个问题?

【问题讨论】:

    标签: java caching database concurrency mbeans


    【解决方案1】:

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

    【讨论】:

    • 让我问你这个。什么是内存足迹? terracotta 会在多个 JVM 中维护对象的多个副本吗?并同步更新它们?还是它会保留一份副本并让不同的进程产生他们拥有自己的副本的错觉?
    • @Random Dude:我不确定答案。我对 Terracotta 的体验仅限于从 San Diego Java User's Group 的一个 Terracotta 人员那里看到一个 2 小时的演示。我怀疑 Terracotta 可能会将整个对象图保存在集群中每个 JVM 的内存中,并将更改代理到其他 JVM。但同样,我对此不是 100% 确定的。或许可以直接与 Terracotta 人联系。
    【解决方案2】:

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

    但听起来你真的应该放弃自我管理的缓存。使用您提到的hibernate 或另一个JPA 实现。 JPA 解决了缓存问题并维护了 L2 共享缓存,因此他们已经为您考虑了这一点。

    【讨论】:

      【解决方案3】:

      我同意 John 的观点 - 在休眠中使用二级缓存并支持集群。通过使用简化的数据访问模型并让 Hibernate 管理细节来更直接地管理数据。

      Terracotta Ehcache 就是这样一种缓存,JBoss、Coherence 等也是。

      有关Hibernate Second Level Cache can be had herein the official Hibernate docs on Chapter 19. Improving Performance 的更多信息(请注意,虽然 Hibernate 文档确实列出了二级缓存提供程序,但该列表已严重过时,例如谁使用 Swarm Cache?最后一个版本是2003)

      【讨论】:

        猜你喜欢
        • 2015-10-10
        • 2014-12-25
        • 2015-05-07
        • 2018-06-09
        • 1970-01-01
        • 2011-05-05
        • 2019-06-27
        • 2010-11-29
        • 1970-01-01
        相关资源
        最近更新 更多