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

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

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

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

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

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

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

要求:

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

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

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

我已经完成了大部分任务,并且我对自己实现Spring Boot Scheduler充满信心,但是同步这些表的这一步令我非常困惑。我需要弄清楚如何进行此操作。任何帮助是极大的赞赏。

最佳答案

因此,我将尝试回答这个问题并将其保持在较高水平...


Spring启动中有一个任务计划程序:https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html这里详细介绍了如何设置一个使用该计划的项目。我将从这个开始。
使用调度程序定期运行-您确定这有多长时间,但又太频繁了,并且很可能会锁定数据库,而且频率太低,数据库将不同步,并且需要较大的更新才能保持同步。我不知道这是否是一个问题,因为我不知道这是一个实时数据库还是只是练习
设置好调度程序后,只需找出两个数据集之间的差异即可。我知道SQL中存在UNION(两个表之间的记录相同-两个集合之间的交集),因此这里存在一个相等且相反的运算符EXCEPT,在此等同于https://www.tutorialspoint.com/sql/sql-except-clause.htm示例。使用它来计算两个表中任何一方的行最多的差异。
我可能不会使用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将其重用到该类具有依赖关系的构造函数中,从而可以重用该对象。这样可以保存同一对象的多个实例。

希望这会有所帮助。如果您有任何疑问,请回答。我会在可能的时候给您答复。

07-25 22:36
查看更多