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

时间:2015-01-05 23:17:00

标签: java sockets caching oracle11g data-synchronization

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

问题]
如果A执行简单事务(插入/更新/删除),则更新A中的缓存。此外,B中的缓存应该自动更新!

当前状态]
我发现并尝试了两种解决方案 - Solution1)使用DatabaseChangeListener
- 解决方案2)使用套接字编程

问题]
该解决方案将用于公司,我想知道是否有任何我可以改进我的解决方案 1)如果我使用DatabaseChangeListener会有什么不利之处?
2)如果我使用套接字编程可能有什么缺点? (也许由于公司政策,开发人员无法维持它的水平太低了?)
3)我听说有第三方缓存也支持同步。我是对的吗?

如果您需要更多信息,请与我们联系!

非常感谢你!

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

2 个答案:

答案 0 :(得分:2)

您的问题时不时出现,但有些不同。一个有用的答案是:Guava Cache, how to block access while doing removal

关于使用DatabaseChangeListener:

虽然你对oracle很好,但我不鼓励使用特定于供应商的接口。对我来说,如果是性能优化,可以使用它,但我永远不会使用特定于供应商的接口来实现基本功能。

其次,更改侦听器的使用可能仍会导致脏读。

关于veritas建议的“分布式缓存”:

分布式缓存和群集缓存之间存在差异。分布式缓存在不同节点上传播(也称为分发)缓存数据,群集缓存是用于跟踪群集内数据一致性的群集应用程序的缓存。分布式缓存通常是群集缓存,但不是相反。有关该主题的一般概念,我建议将有关群集的infinispan文档作为简介:http://infinispan.org/docs/7.0.x/user_guide/user_guide.html#_clustering

总结:

群集缓存实现是您需要的。但是,如果您希望数据一致,则仍需要仔细设计事务处理。

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

答案 1 :(得分:-1)

如果您有许多类似的用例或需要更新许多表,我建议使用第三方缓存。

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

您还可以查找hazelcastmemcached

相关问题