java调用datax实现不同数据库的表的同步
最近工作中需要对不同数据库中的两个表的数据进行同步,然而本菜鸡只会先将表里的数据清空,让后通过@DS注解查询另一张表的数据插入到被清空的表中。本来,代码都写完了,开始运行。哦嚯,由于命名规范,两个表的名称不一样,报错了,找不到那张表。但字段都是一样的,为此再写一个实体,加上@TableName注解又不太合适。前辈告诉我说,用datax同步数据。1.下载与使用一开始,下载的datax的源码,弄了半天
最近工作中需要对不同数据库中的两个表的数据进行同步,然而本菜鸡只会先将表里的数据清空,让后通过@DS注解查询另一张表的数据插入到被清空的表中。本来,代码都写完了,开始运行。哦嚯,由于命名规范,两个表的名称不一样,报错了,找不到那张表。但字段都是一样的,为此再写一个实体,加上@TableName注解又不太合适。前辈告诉我说,用datax同步数据。
1.下载与使用
一开始,下载的datax的源码,弄了半天不会用。所以直接用现成的吧,下载完解压就行了。
放上链接:datax下载地址
在bin目录下可以看到datax.py,看到py所以需要安装python才能运行。一开始我安装的python3.7运行会报错,因为3的print的语法变了,对比2多了个括号,安装2.7就好了。
把要执行的操作写在.json文件中,一般放在job目录下。这里的reader和writerr就跟io流里的一样。
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "",
"password": "",
"column": ["*"],
"splitPk": "id",
"connection": [
{
"table": [
"staff_base_info"
],
"jdbcUrl": [
""
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "",
"password": "",
"column": [
"*"
],
"session": [
"set session sql_mode='ANSI'"
],
"preSql": [
"truncate safe_staff_base_info"
],
"connection": [
{
"jdbcUrl": "",
"table": [
"safe_staff_base_info"
]
}
]
}
}
}
],
"setting": {
"speed": {
"channel": 5
}
}
}
}
完成后在命令行输入 python D:\datax\bin\datax.py D:\datax\job\test.json
2.常见问题
如果 数据库的用户名和密码都正确的情况下,还是报错说密码不正确啥的,大概率是驱动的问题。驱动在D:\datax\plugin\reader\mysqlreader\libs下,datax原生的驱动是5点几来着,我是在本地的maven仓库里找到的驱动换上的,图中是已经换好了,然后mysqlwriter也要换上。
如果运行的时候有乱码,可以在运行前命令行输入
chcp 65001
然后运行,应该就没问题了,现在我已经换回python3.7了,偷个懒,就不运行了。
3.java调用
那接下就是通过java代码来执行这个脚本。看了前辈的代码,可以通过CommandLine这个类实现。具体如下:
public R test() {
new Thread() {
@SneakyThrows
@Override
public void run() {
long startTime = System.currentTimeMillis(); //获取开始时间
CommandLine cmd = new CommandLine("C:\\Program Files\\Python27\\python");
cmd.addArgument("D:\\datax\\bin\\datax.py");
cmd.addArgument("D:\\datax\\job\\test.json");
DefaultExecutor executor = new DefaultExecutor();
ExecuteWatchdog watchdog = new ExecuteWatchdog(600000);
executor.setWatchdog(watchdog);
executor.execute(cmd);
long endTime = System.currentTimeMillis(); //获取结束时间
System.err.println("==============================================================================\n" + "程序运行时间:" + (endTime - startTime) / 1000 + "s" + "\n==============================================================================");
}
}.start();
return R.status(true);
}
搞定,写完了,开始摸鱼。
更多推荐
所有评论(0)