通过数据库在两个 Java 应用程序之间同步

Synchronize between two Java application via Database

背景]
- 有两个 java 应用程序(A 和 B),它们只能通过 Oracle DB
进行通信 - A 和 B 共享同一个数据库表
- A 和 B 将数据存储在缓存中

问题]
如果 A 执行简单事务(insert/update/delete),则更新 A 中的缓存。另外,B中的缓存应该会自动更新!

当前状态]
我找到并尝试过的两个解决方案
- 解决方案 1) 使用 DatabaseChangeListener
- 解决方案2) 使用套接字编程

问题]
解决方案将用于公司,我想知道我的解决方案有什么可以改进的。
1) 如果我使用 DatabaseChangeListener 会有什么缺点?
2)如果我使用套接字编程会有什么缺点? (可能是因为公司政策太低,开发者无法维护?)
3)听说有第三方缓存也支持同步。我说得对吗?

如果您需要更多信息,请告诉我!

非常感谢您!

[编辑]
如果您能在投反对票时发表评论,我们将不胜感激。我想知道如何根据您的反馈改进这个问题!谢谢

如果您有很多类似的用例或需要更新很多表,我会建议使用 3rd Party Cache。

请阅读 terracotta Distributed Cache。 它给了你想要的。

您还可以寻找 hazelcast or memcached

您的问题时不时地出现,但有些方面略有不同。一个有用的答案在这里:Guava Cache, how to block access while doing removal

关于使用 DatabaseChangeListener:

虽然您可以使用 oracle,但我不鼓励使用供应商特定的接口。对我来说,如果是性能优化的话,可以使用,但我绝不会使用供应商特定的接口来实现基本功能。

其次,改变监听器的使用仍然可能导致脏读。

关于 "distributed caches" 正如 veritas 建议的那样:

分布式缓存和集群缓存之间存在差异。分布式缓存将缓存数据分散(又名分发)在不同的节点上,集群缓存是集群应用程序的缓存,用于跟踪集群内的数据一致性。分布式缓存通常是集群缓存,但反之则不然。对于该主题的一般概念,我推荐将关于集群的 infinispan 文档作为介绍:http://infinispan.org/docs/7.0.x/user_guide/user_guide.html#_clustering

总结:

集群缓存实现正是您所需要的。但是,如果你想要数据的一致性,你仍然需要仔细设计你的事务处理。

当然,您也可以自己进行套接字通信,并向其他应用程序发送简单的对象无效消息。具有挑战性的部分是错误处理。 invalidate什么时候成功的?其他节点是否有超时确认?何时删除节点并维护集群状态?