离线/在线数据同步策略

40

我的需求是我有一个服务器端的J2EE Web应用程序和客户端的J2EE Web应用程序。有时候客户端可能会离线,当客户端上线时,应能够进行双向同步。此外,我应该能够根据一些过滤器/规则控制哪些行/表需要进行同步。是否有任何现有的Java框架可用于完成这项工作?如果我需要自己实现,您能提供哪些不同的策略?

我心中有一个解决方案,即维护SQL日志并在同步期间在另一侧执行相同的语句。您认为这种策略存在什么问题吗?

4个回答

29

有许多Java库可用于数据同步/复制。 我知道的两个是daffodilSymmetricDS。 在以前的工作中,我愚蠢地(使用Java)实现了自己的数据复制过程。 它似乎是一件相当简单的事情,但如果数据可以在多个位置同时更新,则非常复杂。 我强烈建议您使用上述项目之一来尝试绕过自己处理此复杂性。


17

同步最大的问题在于当用户离线编辑某些内容时,同时在线上也有数据被编辑了。您需要合并这两个修改后的数据,或者处理UI以允许用户说哪个版本是正确的。如果你可以消除两个同时编辑的可能性,那么你就不必解决这个棘手的问题。

通常的方法是为所有表添加一个“修改”字段,并比较给定行中给定记录的客户端修改字段与服务器的修改日期。如果它们不匹配,则替换服务器数据。

自动生成的键要小心 - 您需要确保在从客户端复制到服务器时维护数据完整性。严格地在服务器上再次运行SQL语句可能会使您处于自动生成密钥已更改的情况下,突然间您的外键指向不同于您预期的记录。

通常在从其他来源导入数据时,您需要跟踪来自外部源的主键以及自己的个人主键。这样做可以更容易地确定数据集之间的变化和差异,以应对困难的同步情况。


3
很抱歉,我投了反对票,因为我认为它大大简化了涉及的问题。它根本没有涉及安全性或选择性同步。Stettler的论文是解决这些问题的很好的入门材料(http://www.ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/Stettler_Christian.pdf)。 - Jen S.
感谢提供的信息。我认为Hamlet的链接是一个很好的参考资料。Kieveli回答的关键点已经足够作为一个30秒阅读的入门指南。 - Hendy Irawan

5
您的同步器需要确定何时可以直接更新数据,何时需要人为干预潜在冲突。我已经撰写了一篇论文,介绍如何使用日志记录和代数定律来实现这一点。 该论文详细阐述了实现方法

2
还有Christian Stettler的硕士论文涉及到这个问题:http://www.ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/Stettler_Christian.pdf存在一些需要解决的重大安全问题,而本文对其进行了很好的覆盖。 - Jen S.
3
@ Jen S. 这个链接无法访问了。 - Gohan
2
Wayback Machine有一份副本:https://web.archive.org/web/20101126093308/http://www.ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/Stettler_Christian.pdf - Robert Claypool

0

在您的应用程序中,哪种客户端数据存储最适合?您可以选择像SQLite这样的嵌入式数据库,或者消息队列、一些对象存储,或者(如果由于是Web应用程序而无法使用这些选项)使用Web DB或IndexedDB通过HTML 5的LocalStorage API保存在客户端上的文件/文档。

请查看论文Gold Rush: Mobile Transaction Middleware with Java-Object Replication。Microsoft的离线系统文档描述了两种方法:面向服务或面向消息和面向数据。 Gold Rush采用了早期的方法。后一种方法使用数据库合并复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接