2008-11-07 220 views
36

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

我的想法之一是在同步期间维护sql日志并在另一侧执行相同的语句。你看到这个策略有什么问题吗?

回答

26

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

15

与同步有关的重大问题是,用户在离线状态下编辑某些内容时,它会在同一时间在线编辑。您需要合并两个更改的数据片段,或者处理UI以允许用户说出哪个版本是正确的。如果你消除了同时编辑的可能性,那么你不必解决这个棘手的问题。

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

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

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

+3

我投下了这个(对不起),因为我认为它大大简化了涉及的问题。它根本没有解决安全问题或选择性同步。来自Stettler的论文是一个很好的介绍问题(http://www.ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/Stettler_Christian.pdf) – 2010-07-15 06:08:07

+0

感谢您的信息。我认为哈姆雷特的链接是一个很好的参考。 Kieveli回答的关键点对于需要30秒钟读数的底漆来说已经足够了。 – 2011-03-21 07:31:37

0

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

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