我想创建一个Java桌面应用程序,可以在数据库中离线存储数据(不仅仅是一些配置文件)。该应用程序应该能够在用户离线时正常运行。当用户上线时,离线数据库应该能够与在线主数据库同步。
有没有什么技术可以实现这个功能?
有没有什么技术可以实现这个功能?
这个问题在stackoverflow上已经被广泛讨论了,通常的建议是:不要自己开发解决方案——这是一个非常专业的领域——可以查找SymmetricDS,它可以满足你的需求。
我最喜欢的讨论之一是离线/在线数据同步策略
使用其中一个可用的纯Java数据库实现作为本地数据库。将任何其他数据库用作远程数据库。 实现逻辑,尝试连接到远程数据库并在失败时回退到本地数据库。如果成功连接远程数据库,则实现数据同步。
当本地应用程序运行时,它不仅应该更改数据库,还应记录更改。当连接可用时,将更改发送到服务器。此外,应用程序接收存储在服务器上的已记录更改(来自其他应用程序实例)。
主要问题是如何合并不同实例所做的更改。有三种变体:
1)每个应用程序实例只能修改其整个数据库的私有部分。你很幸运,不需要合并,服务器可以仅存储日志而不运行整个数据库。
2)修改总是可以自动合并(例如,应用程序可以向公共变量添加值,但不能直接设置它)。服务器运行整个数据库,接受来自客户端的部分日志,生成自己的日志并将其发送给客户端。
3)允许客户端进行任意修改。这会导致潜在的冲突。在发生冲突的情况下,应拒绝其中一个冲突的更改。这意味着,如果客户端进行了本地修改,则稍后可以被服务器拒绝。用户界面必须反映此问题。在其他方面,这与变体2类似。