我的需求是我有一个服务器端的J2EE Web应用程序和客户端的J2EE Web应用程序。有时候客户端可能会离线,当客户端上线时,应能够进行双向同步。此外,我应该能够根据一些过滤器/规则控制哪些行/表需要进行同步。是否有任何现有的Java框架可用于完成这项工作?如果我需要自己实现,您能提供哪些不同的策略?
我心中有一个解决方案,即维护SQL日志并在同步期间在另一侧执行相同的语句。您认为这种策略存在什么问题吗?
我的需求是我有一个服务器端的J2EE Web应用程序和客户端的J2EE Web应用程序。有时候客户端可能会离线,当客户端上线时,应能够进行双向同步。此外,我应该能够根据一些过滤器/规则控制哪些行/表需要进行同步。是否有任何现有的Java框架可用于完成这项工作?如果我需要自己实现,您能提供哪些不同的策略?
我心中有一个解决方案,即维护SQL日志并在同步期间在另一侧执行相同的语句。您认为这种策略存在什么问题吗?
有许多Java库可用于数据同步/复制。 我知道的两个是daffodil和SymmetricDS。 在以前的工作中,我愚蠢地(使用Java)实现了自己的数据复制过程。 它似乎是一件相当简单的事情,但如果数据可以在多个位置同时更新,则非常复杂。 我强烈建议您使用上述项目之一来尝试绕过自己处理此复杂性。
同步最大的问题在于当用户离线编辑某些内容时,同时在线上也有数据被编辑了。您需要合并这两个修改后的数据,或者处理UI以允许用户说哪个版本是正确的。如果你可以消除两个同时编辑的可能性,那么你就不必解决这个棘手的问题。
通常的方法是为所有表添加一个“修改”字段,并比较给定行中给定记录的客户端修改字段与服务器的修改日期。如果它们不匹配,则替换服务器数据。
自动生成的键要小心 - 您需要确保在从客户端复制到服务器时维护数据完整性。严格地在服务器上再次运行SQL语句可能会使您处于自动生成密钥已更改的情况下,突然间您的外键指向不同于您预期的记录。
通常在从其他来源导入数据时,您需要跟踪来自外部源的主键以及自己的个人主键。这样做可以更容易地确定数据集之间的变化和差异,以应对困难的同步情况。
在您的应用程序中,哪种客户端数据存储最适合?您可以选择像SQLite这样的嵌入式数据库,或者消息队列、一些对象存储,或者(如果由于是Web应用程序而无法使用这些选项)使用Web DB或IndexedDB通过HTML 5的LocalStorage API保存在客户端上的文件/文档。
请查看论文Gold Rush: Mobile Transaction Middleware with Java-Object Replication。Microsoft的离线系统文档描述了两种方法:面向服务或面向消息和面向数据。 Gold Rush采用了早期的方法。后一种方法使用数据库合并复制。