异构数据源迁移核心部分代码Mysql到Apache Ignite|VoltDB

最后更新:2025-07-02 23:32:15 | 状态:未完成
异构数据源迁移,大概过程就3步,其他细节就看具体情况了
1.在目标库创建表结构
2.从源库中查出数据
3.插入到目标库
举个从Mysql到Apache Ignite的示例,服务部署参考【Apache Ignite安装部署】【VoltDB编译安装部署
过程中有可能需要合并数据参考,可以通过ConfigStore.override(true)实现【目标库不存在则插入,存在则覆盖或跳过
配置文件
1
2
3
4
5
6
7
8
9
10
anyline.datasource-list=data,ignite,volt spring.datasource.data.driver-class-name=com.mysql.cj.jdbc.Driver
anyline.datasource.data.url=jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
anyline.datasource.data.username=root
anyline.datasource.data.password=root
 
anyline.datasource.ignite.driver-class-name=org.apache.ignite.IgniteJdbcThinDriver
anyline.datasource.ignite.url=jdbc:ignite:thin://127.0.0.1:10800
 
anyline.datasource.volt.driver-class-name=org.voltdb.jdbc.Driver
anyline.datasource.volt.url=jdbc:voltdb://127.0.0.1:21212
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//复制mysql表结构到ignite
public static void init(String table) throws Exception{
    //检测一下ignite中有没有这个表
    Table tab = ServiceProxy.service("ignite").metadata().table(table, false);
    if(null != tab){
        ServiceProxy.service("ignite").ddl().drop(tab);
    }
    //获取mysql表结构
    tab = ServiceProxy.service("data").metadata().table(table, true);
    //根据情况修改一下库名模式名,以及一些默认值约束等,能满足业务需求即可,再讲究一点的话把不需要的列都删除(修改完后注册查询删除时需要明确指定一下列名)
    tab.setSchema("PUBLIC");
    tab.getColumn("REG_TIME").setDefaultValue(null);
    tab.getColumn("UPT_TIME").setDefaultValue(null);
    //创建ignite表
    ServiceProxy.service("ignite").ddl().create(tab);
}
//复制mysql数据到ignite
public static void load(String table){
    Long max = 0L;
    //检测最后一条数据
    DataRow last = ServiceProxy.service("ignite").query(table, "ORDER BY ID DESC");
    if(null != last){
        max = last.getLong("ID", 0);
    }
    while (true){
        //从mysql中查出数据 这里不要用DataSet 太慢
        List<Map> list = ServiceProxy.service("data").maps(table,0,999, "ID>"+max);
        if(list.isEmpty()){
            break;
        }
        //插入到ignite 一般需要修改一下默认日志(不显示日志)要不然日志太多
        //override表示重复数据不覆盖(忽略|跳过)
        ConfigStore configs = new DefaultConfigStore().IS_LOG_SQL(false).IS_LOG_SQL_PARAM(false).override(false);
        ServiceProxy.service("ignite").insert(table, list, configs );
        max = BasicUtil.parseLong(list.get(list.size()-1).get("ID"), 0l);
    }
}

复制表结构过程中,数据类型会自动转换,内置变量有可能不识别,需要调整

生成SQL不执行参考【返回SQL方言以及SQL日志
数据量太大参数【流式查询】【批量操作
增量数据参考【upsert

首页 最近更新 搜索 提交 回复