繁体   English   中英

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

[英]Synchronize between two Java application via Database

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

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

当前状态]
我找到并尝试了两种解决方案
-解决方案1)使用DatabaseChangeListener
-Solution2)使用套接字编程

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

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

提前非常感谢您!

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

您的问题时而时有不同。 一个有用的答案是在这里: Guava Cache,如何在删除时阻止访问

关于使用DatabaseChangeListener:

尽管您对oracle很好,但我不建议使用供应商特定的接口。 对我来说,如果是性能优化,可以使用,但是我绝不会将供应商特定的接口用于基本功能。

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

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

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

包起来:

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

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

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

请阅读有关terracotta分布式缓存的信息 它给出了您想要的。

您也可以寻找hazelcastmemcached

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM