如何创建具有离线和在线数据库,并定期同步的Java桌面应用程序?

5
我想创建一个Java桌面应用程序,可以在数据库中离线存储数据(不仅仅是一些配置文件)。该应用程序应该能够在用户离线时正常运行。当用户上线时,离线数据库应该能够与在线主数据库同步。
有没有什么技术可以实现这个功能?

这是一个应用程序+一个在线服务器吗?还是多个应用程序+一个在线服务器?或者是多个应用程序+多个在线服务器,每个应用程序都有自己的在线服务器? - TacticalCoder
@TacticalCoder 应用程序将有许多实例和一个在线数据库。类似于 Dropbox,但不仅限于文件,而是针对数据库。 - Hristo Hristov
3个回答

2

这个问题在stackoverflow上已经被广泛讨论了,通常的建议是:不要自己开发解决方案——这是一个非常专业的领域——可以查找SymmetricDS,它可以满足你的需求。

我最喜欢的讨论之一是离线/在线数据同步策略


0

使用其中一个可用的纯Java数据库实现作为本地数据库。将任何其他数据库用作远程数据库。 实现逻辑,尝试连接到远程数据库并在失败时回退到本地数据库。如果成功连接远程数据库,则实现数据同步。


通常最好不要直接访问远程数据库,而是通过服务进行访问(Web服务、远程EJB等)。 - Puce
这种方法的问题在于同步部分。我正在寻找一种自动解决此问题的解决方案。我期望当离线插入/删除少量记录时,数据库会保留记录并在联机时应用更改。 - Hristo Hristov

0

当本地应用程序运行时,它不仅应该更改数据库,还应记录更改。当连接可用时,将更改发送到服务器。此外,应用程序接收存储在服务器上的已记录更改(来自其他应用程序实例)。

主要问题是如何合并不同实例所做的更改。有三种变体:

1)每个应用程序实例只能修改其整个数据库的私有部分。你很幸运,不需要合并,服务器可以仅存储日志而不运行整个数据库。

2)修改总是可以自动合并(例如,应用程序可以向公共变量添加值,但不能直接设置它)。服务器运行整个数据库,接受来自客户端的部分日志,生成自己的日志并将其发送给客户端。

3)允许客户端进行任意修改。这会导致潜在的冲突。在发生冲突的情况下,应拒绝其中一个冲突的更改。这意味着,如果客户端进行了本地修改,则稍后可以被服务器拒绝。用户界面必须反映此问题。在其他方面,这与变体2类似。


你会如何实现它?你有教程、示例或涉及的技术链接吗? - iOSAndroidWindowsMobileAppsDev
@Anon,我没有使用工作示例的经验,也无法推荐任何特定的实现。尝试在谷歌上搜索“Java分布式数据库”。如果我要实现这个,那么我首先会实现1-2级,并同时询问用户如何避免和/或解决冲突。然后,根据用户用例,我会实现第三级。 - Alexei Kaigorodov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接