java调⽤datax实现不同数据库的表的同步
最近⼯作中需要对不同数据库中的两个表的数据进⾏同步,然⽽本菜鸡只会先将表⾥的数据清空,让后通过@DS注解查询另⼀张表的数据插⼊到被清空的表中。本来,代码都写完了,开始运⾏。哦嚯,由于命名规范,两个表的名称不⼀样,报错了,不到那张表。但字段都是⼀样的,为此再写⼀个实体,加上@TableName注解⼜不太合适。前辈告诉我说,⽤datax同步数据。
1.下载与使⽤
⼀开始,下载的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": [
"*"
],
java调用python模型
"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);
long endTime = System.currentTimeMillis();    //获取结束时间
}.start();
return R.status(true);
}
搞定,写完了,开始摸鱼。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。