我正在解决一个挑战,我已经走到了最后一步。我正在尝试同步数据库中的两个表。每当在一个表中进行插入,更新或删除时,在另一表中应进行相同的操作。 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充满信心,但是同步这些表的这一步令我非常困惑。我需要明确如何进行此操作。非常感谢您的帮助。
所以我会努力回答这个问题并将其保持在较高水平...
UNION
(两个表之间的记录相同-两个集合之间的交集),因此存在一个相等且相反的运算符EXCEPT
,在这里等效为https://www.tutorialspoint.com/sql/sql-except-clause.htm示例。用它来计算两个表之间的差异,这两个表的任何一方都具有最多的行。V4__*.sql
作品,但是您需要手动维护版本编号,这远非理想。而是生成一个SQL INSERT
语句列表,以针对行数最少的DB运行。作为步骤4的替代方法,您可以运行两个left outer joins
。一种是识别表1中存在哪些行,但表2中没有,另一种是标识表2中存在但表1中没有的行。考虑到逻辑是顺序的,我从此开始可能更容易实现...但是可能会导致比赛状态。在其中更新数据库表1的位置,然后在表1中插入一行,然后更新表2,但是缺少另一行。
[我在您的github存储库中注意到,您有两个@SpringbootApplication
类...一个应删除。我想我知道哪一个,但我会留给您解决。 (提示:)剩下的一个声明了@Bean
对象,其中一个是RestTemplate
...通过@Inject/@Autowire
将其重用到其类有依赖的构造函数中。这样可以保存同一对象的多个实例。
希望这对您有所帮助。如果您有任何疑问,请回复。如果可以,我会尽快回复。