离线/在线数据同步策略

时间:2008-11-07 09:24:35

标签: java database java-ee data-synchronization

我的要求是我有服务器J2EE Web应用程序和客户端J2EE Web应用程序。有时客户端可以脱机。当客户端上线时,他应该能够来回同步更改。此外,我应该能够根据某些过滤器/规则控制哪些行/表需要同步。是否有任何现有的Java框架可以做到这一点?如果我需要自己实施,你可以提出哪些不同的策略?

我想到的一个解决方案是在同步期间维护sql日志并在另一端执行相同的语句。你觉得这个策略有什么问题吗?

4 个答案:

答案 0 :(得分:26)

有许多用于数据同步/复制的Java库。我知道的两个是daffodilSymmetricDS。在以前的生活中,我愚蠢地实现了(在Java中)我自己的数据复制过程。这似乎应该是相当直接的事情,但如果数据可以在多个地方同时更新,那就太复杂了。我强烈建议您使用上述项目中的一个来尝试绕过处理这种复杂性。

答案 1 :(得分:16)

同步的biggist问题是当用户离线编辑某些内容时,它会同时在线编辑。您需要合并两个更改的数据,或处理UI以允许用户说出哪个版本是正确的。如果你没有同时编辑这两者的可能性,那么你就不必解决这个棘手的问题了。

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

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

通常从其他来源导入数据时,您会跟踪来自外部来源的主键以及您自己的个人主键。这使得确定数据集之间的变化和差异更容易进行困难的同步情况。

答案 2 :(得分:4)

您的同步器需要确定何时可以更新数据以及何时人类需要调解潜在冲突。我写了paper that explains how to do this using logging and algebraic laws

答案 3 :(得分:0)

什么最适合作为应用程序中的客户端数据存储?您可以选择嵌入式数据库,如SQLite或消息队列或某些对象存储,或者(如果它们都不能用于Web应用程序),使用Web DB或IndexedDB通过客户端保存的文件/文档HTML 5的LocalStorage API。

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