通过设置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) , 找到以后将当前的位置加到之前的结束位置上 , 保证了数据的完整性;
推荐阅读
- 如何判断Linux系统是否被黑客入侵?可以用这种方法
- Linux版 腾讯云服务器如何手动搭建 WordPress 个人站点
- 如何挑选蚬子
- 如何挑选红菜苔
- 如何挑选鹌鹑
- 如何挑选豆皮
- 如何自制葱油
- 如何挑选黄豆
- 如何挑选牛奶
- 如何挑选青豆