Java 离线/在线数据同步策略

Java 离线/在线数据同步策略,java,database,jakarta-ee,data-synchronization,Java,Database,Jakarta Ee,Data Synchronization,我的要求是我有服务器J2EE web应用程序和客户端J2EE web应用程序。有时客户端可以脱机。当客户机联机时,他应该能够前后同步更改。此外,我应该能够根据一些过滤器/规则控制哪些行/表需要同步。是否有任何现有的Java框架可以实现这一点?如果我需要自己实施,您可以建议哪些不同的策略 在我看来,一种解决方案是在同步过程中维护sql日志并在另一端执行相同的语句。你认为这种策略有什么问题吗?同步的主要问题是当用户离线编辑某个内容时,同时在线编辑该内容。您需要合并两个已更改的数据片段,或者处理UI以

我的要求是我有服务器J2EE web应用程序和客户端J2EE web应用程序。有时客户端可以脱机。当客户机联机时,他应该能够前后同步更改。此外,我应该能够根据一些过滤器/规则控制哪些行/表需要同步。是否有任何现有的Java框架可以实现这一点?如果我需要自己实施,您可以建议哪些不同的策略


在我看来,一种解决方案是在同步过程中维护sql日志并在另一端执行相同的语句。你认为这种策略有什么问题吗?

同步的主要问题是当用户离线编辑某个内容时,同时在线编辑该内容。您需要合并两个已更改的数据片段,或者处理UI以允许用户说出哪个版本是正确的。如果您消除了同时编辑这两个文件的可能性,那么就不必解决这个棘手的问题

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

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


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

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

您的同步器需要确定何时可以更新数据,以及何时人类需要调解潜在冲突。我写了一封信

什么最适合作为应用程序中的客户端数据存储?您可以从嵌入式数据库(如SQLite)或消息队列或某些对象存储中进行选择,或者(如果由于它是web应用程序而无法使用这些存储)使用web DB或通过HTML 5的API保存在客户端上的文件/文档


检查一下报纸。Microsoft关于偶尔连接的系统的文档描述了两种方法:面向服务或面向消息和面向数据。淘金热采取了更早的方法。后一种方法使用数据库合并复制

还有Christian Stettler关于这个问题的硕士论文:有一些重大的安全问题需要解决,这篇论文对它们进行了很好的阐述。@Jen s.这个链接再也无法访问Wayback机器有一个副本:我否决了这个(抱歉),因为我认为它大大简化了所涉及的问题。它根本不涉及安全性或选择性同步。Stettler的论文很好地介绍了这些问题(),谢谢你提供的信息。我认为哈姆雷特的链接是一个很好的参考。基维利回答的要点对于一本需要30秒阅读的初级读物来说已经足够好了。