如何快速安全的插入千万条数据?( 二 )

通过设置max_allowed_packet , 保证数据库能够接收批次插入的数据包大小;不然会出现如下错误:
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4980577 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.    at com.mysql.jdbc.MysqlIO.send(MysqlIO.JAVA:3915)    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598)    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834)3.准备测试数据public static void main(String[] args) throws IOException {    FileWriter out = new FileWriter(new File("D://xxxxxxx//orders.txt"));    for (int i = 0; i < 10000000; i++) {        out.write(                "vaule1,vaule2,vaule3,vaule4,vaule5,vaule6,vaule7,vaule8,vaule9,vaule10,vaule11,vaule12,vaule13,vaule14,vaule15,vaule16,vaule17,vaule18");        out.write(System.getProperty("line.separator"));    }    out.close();}使用FileWriter遍历往一个文件里插入1000w条数据即可 , 这个速度还是很快的 , 不要忘了在每条数据的后面添加换行符(nr);
4.截取数据的完整性除了需要设置每次读取文件的大小 , 同时还需要设置一个参数 , 用来每次获取一小部分数据 , 从这小部分数据中获取换行符(nr) , 如果获取不到一直累加直接获取为止 , 这个值设置大小大致同每条数据的大小差不多合适 , 部分实现如下:
ByteBuffer byteBuffer = ByteBuffer.allocate(buffSize); // 申请一个缓存区long endPosition = batchFileSize + startPosition - buffSize;// 子文件结束位置long startTime, endTime;for (int i = 0; i < count; i++) {    startTime = System.currentTimeMillis();    if (i + 1 != count) {        int read = inputChannel.read(byteBuffer, endPosition);// 读取数据        readW: while (read != -1) {            byteBuffer.flip();// 切换读模式            byte[] array = byteBuffer.array();            for (int j = 0; j < array.length; j++) {                byte b = array[j];                if (b == 10 || b == 13) { // 判断nr                    endPosition += j;                    break readW;                }            }            endPosition += buffSize;            byteBuffer.clear(); // 重置缓存块指针            read = inputChannel.read(byteBuffer, endPosition);        }    } else {        endPosition = fileSize; // 最后一个文件直接指向文件末尾    }    ...省略 , 更多可以查看Github完整代码...}如上代码所示开辟了一个缓冲区 , 根据每行数据大小来定大概在200字节左右 , 然后通过遍历查找换行符(nr) , 找到以后将当前的位置加到之前的结束位置上 , 保证了数据的完整性;


推荐阅读