【问题标题】:Java architecture for updating then comparing differences用于更新然后比较差异的 Java 架构
【发布时间】:2015-10-07 12:34:32
【问题描述】:

我目前有一个应用程序,它维护存储在数据库中的对象中的事务的最新信息。由于高性能和并发性,我们目前遇到了垃圾收集的瓶颈。现在,新数据以新对象的形式出现,然后使用数据库中的旧信息进行更新,并运行多个查看过程,以确保可以获得最新的信息。新更新的对象被存储回数据库,然后在通知下游系统之前比较两个对象的差异。

我想删除比较两个独立对象的概念,因为该对象非常大,具有许多嵌套结构并且正在创建大量垃圾集合。有没有办法更新单个对象,但能够在理想情况下看到该对象发生了什么变化,而无需反射和注释来保持性能?

NewObject
    Timestamp: 456
    Name: joe
    Event: breakfast

OldObject
    Timestamp: 123
    Name: joe
    Event: dinner

将新对象保存到数据库然后比较

if(OldObject.getTimestamp().isNewerThan(NewObject.getTimestamp()) 
&&       NewObject.getEvent() == "breakfast") {
    NotifyHandler.notify(NewObject.getName() + " at Breakfast");
}

【问题讨论】:

  • 您需要知道发生了什么变化吗?还是只是对象发生了变化?
  • 你为什么要比较对象超出了我的理解,但是如果你要比较两个大对象并且你知道其中一个已经被修改,那么 hashCode() 是没用的。对于大量请求,您可以使用 Redis 并将对象直接插入 Redis(不是 memcached)。
  • 我需要知道发生了什么变化以及它是如何变化的。例如,如果两个对象都有时间戳,我需要知道它已经改变以及这两个值是什么。我只需要已更改字段的旧值。
  • 你能用(伪)代码举例说明你拥有和想要拥有的东西吗?跟踪对象的变化就像从每个 setter 中设置一个布尔值一样简单。
  • 为什么?您从数据库中检索一个对象,更新特定字段并编辑数据库中已经存在的对象,就是这样,不需要比较。你应该从改变编辑人员的方法开始,这是我的想法,我已经告诉过你 Redis。

标签: java database performance architecture


【解决方案1】:

如果您尝试制作某种更改日志,我可能会通过在创建事物的原始对象上创建设置器来构建它。

因此,当数据库更新开始时,重置更改日志,然后,当每个方法为现有对象设置新值时,将其与旧值进行比较(在 setter 方法内部),如果不同,则添加一个条目到您的更改日志中。

更新完成后,您的更改日志应该包含所有更新。

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多