问题:
datax同步数据, 传输一定量数据后, 速度变为0
排查:
尝试过更改job的json配置无数种, 都没有效果.
通过改datax源码加log, 发现卡的位置在ResultSet.next()的地方:com/alibaba/datax/plugin/rdbms/reader/CommonRdbmsReader.java:207
......
......
rs = DBUtil.query(conn, querySql, fetchSize);
queryPerfRecord.end();
ResultSetMetaData metaData = rs.getMetaData();
columnNumber = metaData.getColumnCount();
//这个统计干净的result_Next时间
PerfRecord allResultPerfRecord = new PerfRecord(taskGroupId, taskId, PerfRecord.PHASE.RESULT_NEXT_ALL);
allResultPerfRecord.start();
long rsNextUsedTime = 0;
long lastTime = System.nanoTime();
while (rs.next()) { // <- 卡在这
rsNextUsedTime += (System.nanoTime() - lastTime);
this.transportOneRecord(recordSender, rs,
metaData, columnNumber, mandatoryEncoding, taskPluginCollector);
lastTime = System.nanoTime();
}
allResultPerfRecord.end(rsNextUsedTime);
......
于是想到驱动可能有问题, 升级了驱动, 并且改了一下这里的代码形式, 让异常更详细一些:
rs.next();
while (!rs.isAfterLast()) {
rsNextUsedTime += (System.nanoTime() - lastTime);
this.transportOneRecord(recordSender, rs,
metaData, columnNumber, mandatoryEncoding, taskPluginCollector);
lastTime = System.nanoTime();
try {
rs.next();
} catch (SQLException e) {
LOG.error("result set read exception: {}", e.getMessage(), e);
throw e;
}
}
驱动是mysql-connector-java-5.1.34.jar的时候, datax的log里一直打印一个不变的速度, 没有抛异常.
将驱动更换为mysql-connector-java-5.1.49.jar后( 路径在datax/plugin/reader/mysqlreader/libs/) , 抛出异常:
java.sql.SQLException: Query execution was interrupted, maximum statement execution time exceeded
这个错误的原因是超出了语句最长执行时间.
解决:
jdbcUrl里设置 max_execution_time, 单位是毫秒, 如下
jdbc:mysql://localhost:3306/db_name?sessionVariables=MAX_EXECUTION_TIME=68400000
或者修改datax源码 com/alibaba/datax/plugin/rdbms/util/DataBaseType.java:45, 将sessionVariables=MAX_EXECUTION_TIME=68400000添加到默认的后缀.
然后替换datax部署位置中的jar包, 一般位置是:datax/plugin/reader/mysqlreader/libs/