同步数据库中的表-H2 -Springboot-Maven-Flyway-Java

问题描述 投票:0回答:1

我正在解决一个挑战,我已经走到了最后一步。我正在尝试同步数据库中的两个表。每当在一个表中进行插入,更新或删除时,在另一表中应进行相同的操作。 github存储库在下面列出,这些是我正在查看的一些文章,以查看这是否可以解决此问题。另外请记住,我不知道Java的形状或形式。我是JavaScript的初级开发人员,因此请进行详尽的解释,以便我有更好的机会了解所提出的解决方案。这是挑战...

我们需要创建2个数据库表,分别称为Task_definition和Task_definition_mirror。每个表都有以下列:[ID,名称,描述]。 ID是主键。名称不能为空,描述不能为空。

用户可以在任何给定时间点修改任何这些表中的数据(即,更改名称或/和描述的值,删除行,插入新行)。

一旦在任何一个表上进行任何更改,该更改应同步到另一个表。

用户或/和其他应用程序可以直接修改表(即,没有Web应用程序,只有SQL语句在DB上运行)。

不允许使用数据库触发器。解决方案应使用纯Java编写。

提示:您可以利用Spring-boot-scheduler功能

要求:

解决方案应该有效干净易读的代码该项目应使用Maven该项目应该使用Spring BootFlyway应该管理表定义的创建测试应包括在内。测试应证明您的解决方案有效。请使用H2数据库

当前github仓库与我的代码解决方案https://github.com/antdevelopment1/javaChallenge

这是我想可以使用的,但不确定。http://www.h2database.com/html/advanced.html#clustering

我已经完成了大部分任务,我对自己实现Spring Boot Scheduler充满信心,但是同步这些表的这一步令我非常困惑。我需要明确如何进行此操作。非常感谢您的帮助。

java spring-boot maven h2 flyway
1个回答
0
投票

所以我会努力回答这个问题并将其保持在较高水平...

  1. Spring引导中有一个任务计划程序:https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html在此详细说明如何设置使用此任务的项目。我将从这个开始。
  2. 使用调度程序定期运行-您确定这有多长时间,但又太频繁了,您可能会锁定数据库,频率太低,数据库将不同步,需要较大的更新才能保持同步。我不知道这是否是一个问题,因为我不知道这是实时数据库还是只是练习
  3. 一旦设置了调度程序,您只需找出两个数据集之间的差异。我知道SQL中存在UNION(两个表之间的记录相同-两个集合之间的交集),因此存在一个相等且相反的运算符EXCEPT,在这里等效为https://www.tutorialspoint.com/sql/sql-except-clause.htm示例。用它来计算两个表之间的差异,这两个表的任何一方都具有最多的行。
  4. 我可能不会使用flyway进行迁移,因为我对flyway的理解(过去一两个月为MySql自动化了一些数据库初始化脚本)是因为它用于运行数据库状态从一个状态到另一个状态的迁移。 (例如添加列并将值更新为某些默认值),而不是定期插入数据。尽管您可以一次性生成V4__*.sql作品,但是您需要手动维护版本编号,这远非理想。而是生成一个SQL INSERT语句列表,以针对行数最少的DB运行。

作为步骤4的替代方法,您可以运行两个left outer joins。一种是识别表1中存在哪些行,但表2中没有,另一种是标识表2中存在但表1中没有的行。考虑到逻辑是顺序的,我从此开始可能更容易实现...但是可能会导致比赛状态。在其中更新数据库表1的位置,然后在表1中插入一行,然后更新表2,但是缺少另一行。

[我在您的github存储库中注意到,您有两个@SpringbootApplication类...一个应删除。我想我知道哪一个,但我会留给您解决。 (提示:)剩下的一个声明了@Bean对象,其中一个是RestTemplate ...通过@Inject/@Autowire将其重用到其类有依赖的构造函数中。这样可以保存同一对象的多个实例。

希望这对您有所帮助。如果您有任何疑问,请回复。如果可以,我会尽快回复。

© www.soinside.com 2019 - 2024. All rights reserved.