java 在客户端和应用程序之间同步数据库

ar5n3qh5  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(234)

我有如下设置。我有一个服务器,和几个应用程序(Sping Boot Java应用程序)。服务器和应用程序有单独的(H2)数据库,这样他们就可以做离线工作。
客户端知道服务器的地址,但服务器不知道客户端的地址。我如何在它们之间同步数据库?我想实现一个时间表,当客户端在线时将数据发送到服务器,但服务器也可以进行更改....而且我有几个对象要同步。
有没有现成的解决方案?我检查了SymmetricDS,但每个人都必须知道对方的地址。

pqwbnv8z

pqwbnv8z1#

最近,我开始处理一个具有类似需求的项目。我还没有完全实现它,但我将告诉您我是如何计划它的。在这里,我假设您在联机服务器上有一个数据库,用于同步来自本地应用程序的数据。
1.确保每个记录(本地和联机)都有一个状态属性,显示它已同步。然后,在创建或更新过程中,所有本地记录都将标记为未同步。
1.确保在线数据库中没有主键(p.k)冲突。例如,应用程序1和2可能有名为“users”的数据库表,其中包含的每个记录的p.k都是10。因此,对于这类系统,建议使用非数字p.k设计,如UUID(尽管有一些折衷)。
1.由于只有本地应用程序知道在线服务器的地址,因此同步由本地应用程序通过使用Crontasks启动。同步也可以由用户触发,或者应用程序可以监听网络连接并在连接时触发同步。
1.为确保本地应用程序和网上服务器之间的数据能正确同步,需要双向连接。由于本地应用程序知道服务器地址,因此它们会发出初始连接请求。这种连接可帮助服务器通知本地应用程序从另一个本地应用程序收集的其他数据。
1.当在线服务器从应用程序接收到记录时,将其保存为已同步,然后通知本地应用程序已成功保存。本地应用程序应在将记录发送到在线服务器之前将其标记为已同步。当本地应用程序从在线服务器接收到不成功的同步时,则该记录被标记为未同步。在将记录发送到联机服务器之前将其标记为已同步的原因是,本地应用程序可能已在同步响应从当本地应用完成向在线服务器发送未同步的数据时,在线服务器开始发送从当前本地应用还不具有的其他本地应用收集的数据。
1.即使上面的设置可以使用HTTP请求/响应方法来实现,但很明显,由于RSocket的众多特性,它在此应用程序中具有更多优势:

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

有很多的Rsocket材料,以帮助您开始在Spring Boot 。Here's is the official doc.有精彩的YouTube videos上,以及由乔什长。

deyfvvtc

deyfvvtc2#

最近,我从一个客户那里收到了类似的要求。我的方法与Wilson使用的方法相似。但是我只对对象使用数字id。下面是详细信息-
1.每个模型都有两个额外的字段- remoteId和synced。remoteId是另一个服务器的ID。每当创建或更新任何实体时,synced标志都设置为false。
1.同步由本地服务器使用cron计划触发。
1.本地服务器获取所有未同步的数据(synced=false),并以json格式将它们发送到联机服务器。
1.远程服务器接收数据,交换id和remoteId的值,将synced标志标记为true,然后保存数据。
1.在成功处理数据后,在线服务器向本地服务器发送具有所保存的id的确认。
1.收到确认后,本地服务器将更新已发送对象,将remoteId标记为online id,将synced标志标记为true。
1.类似地,本地服务器向在线服务器请求任何未同步的数据。在线服务器获取所有未同步的在线数据,并将它们发送到本地服务器。
1.本地服务器保存接收到的数据,将id更改为remoteId,并将synced标志标记为true。完成后,本地服务器向联机服务器发送确认,其中包含保存的对象的id。
1.在接收到确认时,在线服务器用接收到的id作为远程id并且用同步标志作为真来更新对象。
为了处理删除同步,使用了实体监听器。每当删除任何具有非空remoteId的实体时,监听器都会生成一个表条目。删除记录在同步时在服务器之间交换,然后进行处理。处理完成后,另一个服务器将得到确认,并清除那里的删除同步表数据。
如有潜在风险或改进意见,请帮忙提出:)

相关问题