dataSource = jdbcTemplate.getDataSource();

conn = dataSource.getConnection();

conn.setAutoCommit(false);

statement = conn.prepareStatement(loadDataSql);

if (statement.isWrapperFor(com.mysql.jdbc.PreparedStatement.class)) {


mysqlStatement = statement.unwrap(com.mysql.jdbc.PreparedStatement.class);

mysqlStatement.setLocalInfileInputStream(dataStream);

result = mysqlStatement.executeUpdate();

}

上面的这段代码,同样的dataStream,
loadDataSql为LOAD DATA LOCAL INFILE 'sql.csv' ignore INTO TABLE时,能正常运行
loadDataSql为LOAD DATA LOCAL INFILE 'sql.csv' replace INTO TABLE时,报Communications link failure
刚开始怀疑因为replace有两个操作,导致超时,但是The last packet successfully received from the server was 3 milliseconds ago.
The last packet sent successfully to the server was 1 milliseconds ago,显然没到超时时间。

最后通过定位发现原来是数据不完整,用ignore可以正常入库,replace不能,应该是replace的语法比ignore更严格。
只是被报的这个错迷惑了。