背景:
领导布置任务,让把两个数据库中存储的数据全部迁移到另一个数据库中
分别是:mysql--->oceanbase,oracle--->oceanbase这两个。
步骤:
mysql--->oceanbase
先将mysql中的数据迁移到oceanbase中,本来领导布置的是15张表,但是领导没注意到有外键,结果多了三张基础表,所以一共是18张表,有外键,所以迁移顺序是有要求的。先将建表语句DDL创建完毕,然后在建表语句的基础上迁移数据。
在这里我使用的是责任链模式,一是数据的量不大,二是表数据迁移是有顺序的。
先创建一个处理器接口,这个接口中有一个方法migrate(),所有的handler都要实现这个接口,每个handler中的migrate()方法都调用自己具有的三个方法,一是selectList(),将mysql中的数据表中的数据查询出来;二是processData(),对数据进行处理;三是writeToOceanbase(),将数据写入到oceanbase数据库中。在这个过程中使用mybatisplus的@DS注解,实现数据源的切换。
然后写一个责任链管理器MigrationChainManager,用来对责任链进行管理,在这里通过反射的方式获取所有的handler,利用多态,左边是接口,右边是通过反射拿到的实现类,然后调用接口中的migrate()方法,实现数据的迁移。
在这个过程中,将要处理的handler的名字写入到nacos中,通过配置类读取,然后再责任链管理器中通过for循环的方式按nacos中的配置文件的顺序一次拿到对应的处理器进行处理。从而实现责任链的顺序。
oracle--->oceanbase
这个数据库就三张表,而且没有外键,不值得使用责任链模式,使用模板方法直接迁移就行。
先创建一个接口,这个接口中有四个待实现方法,分别是:truncateTable()用来实现目标数据库数据的清理;sourceData()用来从源数据库获取数据;processData()用来处理从源数据库获得的数据;writeToOceanBase()用来将数据写入到目标数据库。还有一个默认方法:migrate()用来按照顺序调用上述四个方法。
子类实现接口,重写四个方法。然后在service方法中,注入四个子类对象,然后在调用migrate()方法,即可实现数据的迁移。
注意事项:
1.数据源切换的时候,由于使用的是mybatisplus的@DS注解,这个注解不能配合@Translational注解使用,因为后者会导致数据源的锁定,不能实现数据源的切换。
2.@DS注解使用的时候,在配置文件中的数据源的配置是用规定的配置顺序的。
3.设计模式设计好模板,重复的代码交给AI。
4.oracle数据库的数据库结构和mysql不一样,配置起来也不一样。