首页 > 解决方案 > 在客户端和应用程序之间同步数据库

问题描述

我有以下设置。我有一个服务器和几个应用程序(Spring boot java 应用程序)。服务器和应用程序具有独立的 (h2) 数据库,因此它们可以进行离线工作。

客户端知道服务器地址,但服务器不知道客户端地址。如何在它们之间同步数据库?我想实现一个调度表,当客户端在线时将数据发送到服务器,但是服务器也可以进行更改......而且我有几个对象要同步。

没有开箱即用的解决方案吗?我检查了 SymmetricDS 但那里的每个人都必须知道彼此的地址。

标签: javaspring-bootsynchronizationh2

解决方案


最近,我开始从事一个有类似要求的项目。我还没有完全实现它,但我会告诉你我是如何计划的。在这里,我假设您在在线服务器上有一个数据库来同步来自本地应用程序的数据。

  1. 确保每条记录(本地和在线)都具有显示已同步的状态属性。然后在创建或更新期间将所有本地记录标记为未同步。

  2. 确保您的在线数据库中没有主键 (pk) 冲突。例如,应用程序 1 和 2 可能具有称为“用户”的数据库表,其中包含每个 pk 为 10 的记录。因此,建议对此类系统使用 UUID 之类的非数字 pk 设计(尽管有一些折衷)。

  3. 由于只有本地应用程序知道在线服务器的地址,所以同步是由本地应用程序使用 Crontasks 发起的。同步也可以是用户触发的,或者应用程序可以监听网络连接并在连接时触发同步。

  4. 为了确保本地应用程序和在线服务器之间的数据正确同步,需要双向连接。初始连接请求由本地应用程序发出,因为它们知道服务器地址。这种连接将帮助服务器通知本地应用程序有关从另一个本地应用程序收集的其他数据。

  5. 当在线服务器接收到来自应用程序的记录时,它会将其保存为同步,然后通知本地应用程序保存成功。本地应用程序应在将记录发送到在线服务器之前将其标记为已同步。当本地应用程序从在线服务器接收到不成功的同步时,该记录被标记为未同步。在将记录发送到在线服务器之前将其标记为同步的原因是,本地应用程序可能在同步响应从在线服务器返回之前更改了记录的状态。当本地应用程序完成向在线服务器发送未同步的数据时,在线服务器开始发送从当前本地应用程序尚未拥有的其他本地应用程序收集的数据。

  6. 甚至上述设置也可以使用 HTTP 请求/响应方法来实现,很明显,RSocket由于其众多功能,在此应用程序中具有更多优势:

  • 连接是双向的
  • 两端可以通过发送请求和接收响应来充当客户端和服务器
  • 控制数据发送和接收的背压
  • 请求和响应是二进制数据流,因此速度有保证
  • 等等

有很多Rsocket资料可以帮助您开始使用 Spring Boot。 这是官方文档。 Josh Long也有精彩的YouTube 视频


推荐阅读