【问题标题】:Java - Framework to detect if Object has changed / dirty detection mechanismJava - 检测对象是否已更改/脏检测机制的框架
【发布时间】:2016-05-12 06:10:43
【问题描述】:

亲爱的,我目前正在实现一个 Java 客户端,该客户端大量使用第三方 Web 服务。为了获得性能,我只想在客户端上的对象被修改(变脏)的情况下调用 webservices。

与其编写能够检测对象是否脏的自己的框架,是否存在任何可重用且不绑定到其核心产品(例如休眠)的开放/通用框架?

【问题讨论】:

  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • 就像吉姆说的。但是看看ObservableValue 或来自JavaFX 的任何Observable 实现。已经在你的 JDK 中了。
  • 谢谢你们,我完全同意 Jim,但是我不喜欢从头开始,例如编写自己的 setter 方法,我正在寻找可用于简单 java bean 的框架或策略

标签: java hibernate caching frameworks dirty-data


【解决方案1】:

我认为对象不是一个单一的标量值,而是一个 bean。

从技术上讲,您可以做各种花哨的事情来检测 bean 突变,例如更改字节码并在对象字段更新时添加一些代码。

另一种选择是保留旧 bean 实例的副本并进行比较。 所以实际上问题归结为比较两个 bean,这里问的是:how to generically compare entire java beans? 可能你会发现更多,一般来说有很多框架处理 bean。

但是,由于您调用 Web 服务,因此您必须有一种机制来序列化您的对象。您可以在发送更新请求之前使用新旧对象的序列化形式来比较身份。

更改通知: 我不建议将更改侦听器附加到每个 bean。这可能会改变您的总体性能并引入内存泄漏。还有一个事务问题:如果更新了多个bean属性,那么一个bean的更新是什么时候完成的?所以无论如何你都需要在突变之后进行显式调用。

对我自己和其他缓存人员的注意: 实际上,这是在缓存上提供像 Cache.putIfNotEquals(key, value) 这样的方法的用例,这并不费力。缓存已经存储了之前的值,并且只有在值发生变化时才会调用缓存写入器(通过设置写入)。

【讨论】:

  • 非常感谢你!是的,在谷歌进行一些研究后,我得出了相同的结论,或者您使用 - 自己的“Setter”方法 - 或字节码增强 - 或者正如您指出的“序列化”。所以我决定去连载
【解决方案2】:

为其他人提供一个起点。

    TestBean bean1 = new TestBean("AAA");
    TestBean bean2 = new TestBean("BBB");

    log.info("serialize...");
    ByteArrayOutputStream str1 = new ByteArrayOutputStream();
    ObjectOutputStream oos1 = new ObjectOutputStream(str1);
    oos1.writeObject(bean1);
    byte[] serialized1 = str1.toByteArray();
    oos1.close();

    ByteArrayOutputStream str2 = new ByteArrayOutputStream();
    ObjectOutputStream oos2 = new ObjectOutputStream(str2);
    oos2.writeObject(bean2);
    byte[] serialized2 = str2.toByteArray();
    oos2.close();

    log.info("compare");
    boolean same = Arrays.equals(serialized1, serialized2);

这种方法的优点

  • 您可以序列化整个对象结构,因此它支持开箱即用的复杂层次结构,您不必关心循环(父/子)
  • 您可以对要从序列化/比较中排除的成员使用“transient”关键字
  • 您不必向 bean 类添加一些样板代码(除了该类需要实现 Serializable 接口)

缺点

  • 它不是细粒度的,所以你不会开箱即用哪些字段是脏的。使用own serialization format 有一些复杂的方法
  • 我还没有考虑过性能,但我可以想象其他方法也不是免费的,因此您需要自己测试和调整方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多