该方法比较长,大家可以去细看,主要功能还是解析了客户端发送过来的 SQL 语句,然后针对 LOAD DATA 语法,如果导入文件是本机文件,则直接进行解析,否则的话会向客户端发送获取文件的命令,让客户端传输文件过来:public void start(String strSql) {
……
parseLoadDataPram();
//如果文件不在本地,则向客户端发送命令,请求数据文件,这里的local可能会让人疑惑,但MySQL语法确实是这么规定的,load data local用法反而是文件不在本地的用法
if (statement.isLocal()) {
isStartLoadData = true;
//request file from client
ByteBuffer buffer = serverConnection.allocate();
RequestFilePacket filePacket = new RequestFilePacket();
filePacket.setFileName(fileName.getBytes());
filePacket.setPacketId(1);
filePacket.write(buffer, serverConnection, true);
} else {
//如果文件在本地的话,先判断文件是否存在,不存在则报错,存在的话需要对文件进行读取,计算每一行的路由结果,然后对不同节点的数据分别进行存储
if (!new File(fileName).exists()) {
String msg = fileName + " is not found!";
clear();
serverConnection.writeErrMessage(ErrorCode.ER_FILE_NOT_FOUND, msg);
} else {
if (parseFileByLine(fileName, loadData.getCharset(), loadData.getLineTerminatedBy())) {
RouteResultset rrs = buildResultSet(routeResultMap);
if (rrs != null) {
flushDataToFile();
isStartLoadData = false;
serverConnection.getSession2().execute(rrs);
}
}
}
}
}