最近工作中需要对不同数据库中的两个表的数据进行同步,然而本菜鸡只会先将表里的数据清空,让后通过@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);
	}

 搞定,写完了,开始摸鱼。

        

更多推荐