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

标签 java spring-boot maven h2 flyway

我正在解决一个作为挑战而提出的问题,并且已经到了最后一步。我正在尝试同步数据库内的两个表。每当一个表中发生插入、更新或删除操作时,另一表中也应该发生同样的情况。下面列出了 github 存储库,这些是我正在查看的一些文章,看看是否可以解决这个问题。另请记住,我对 Java 没有任何了解。我是一名初级 JavaScript 开发人员,因此请详细解释,以便我有更好的机会理解建议的解决方案。这就是挑战...

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

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

一旦任何表发生任何更改,更改应同步到另一个表。

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

不允许使用数据库触发器。该解决方案应该用纯 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,但是同步这些表的这一步让我感到非常困惑。我需要弄清楚如何解决这个问题。非常感谢任何帮助。

最佳答案

所以我会尝试回答这个问题并保持相对较高的水平......

  1. Spring boot 中有一个任务调度程序: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 语句列表,以针对行数最少的数据库运行。

作为步骤 4 的替代方案,您可以运行两个左外连接。第一个用于识别哪些行出现在表 1 中但不出现在表 2 中,第二个用于识别哪些行出现在表 2 中但不出现在表 1 中。我将从这一点开始,因为考虑到逻辑是顺序的,它可能更容易实现...但这可能会导致竞争条件。您更新数据库表 1。然后将一行插入表 1,然后更新表 2,但缺少附加行。

我注意到在你的 github 存储库中你有两个 @SpringbootApplication 类......其中一个应该被删除。我想我知道是哪一个,但我会让你自己弄清楚。 (提示:)剩下的那个声明了 @Bean 对象,其中之一是 RestTemplate...通过 @Inject/@Autowire 重用它'将其放入任何依赖它的类的构造函数中。这可以节省对同一对象的多个实例的更新。

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

关于java - 同步数据库中的表 - H2 -Springboot - Maven - Flyway - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61841901/

相关文章:

java - 分割字符串

java - 模板方法模式 - 命名约定

java - 运行时通过条件进行依赖注入(inject)

java - 在 Maven 中部署用于生产的 jar

java - Maven war 构建复制资源 : tomcat7:run does not recognise copied resources

java - 使用 Maven 构建 Spring Boot 项目

java - CAS 5.3 管理 - 发现多个名为 [spring_web] 的片段。这对于相对顺序来说是不合法的

java - Spring Boot 不再包含 ElasticSearch Rest HealthIndicatorAutoConfiguration

spring-boot - 使用 Spring Kafka/Spring Boot 从主题的开头(偏移量 = 0)读取

spring - 未调用 ResponseEntityExceptionHandler 的重写 handleMethodArgumentNotValid 方法