这是个对list按指定的尺寸分割的代码,为何要记录这个问题,在我的mysql做批量插入时出现了
Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1875824 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
这个错误,经我们分析,是批量插入一次传递的数据太多,一个方式是修改max_allowed_package 这个参数,那个异常已经说明了解决方式(You can change this value on the server by setting the max_allowed_packet' variable),第二就是对批量插入的数据list进行切割这个效果就好了,因为修改参数还是存在着不确定性,所以还是用切割吧。写了一段小例子测试一下算法,记录一下,其实没有什么指导意义,看这篇文章的可别说我low,附上算法和测试代码:
List<Integer> testlist=new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6));
int startindex=10; //这个控制切割的大小,如果太大修改这个参数
for(int i=startindex;;){
if(testlist.size()<i){
int start=i-startindex<0?0:i-startindex;
if( testlist.subList(start, testlist.size()).size()>0){
for (Integer integer : testlist.subList(start, testlist.size())) { //切割后得到的list为 testlist.subList(start, testlist.size())
System.out.print("qiege2="+integer);
}
}
System.out.println();
break;
}else{
for (Integer integer : testlist.subList(i-startindex,i)) { //切割后dedao的list为 testlist.subList(i-startindex,i)
System.out.print("qiege2="+integer);
}
System.out.println();
}
i=i+startindex;
}
int startindex=10; //这个控制切割的大小,如果太大修改这个参数
for(int i=startindex;;){
if(testlist.size()<i){
int start=i-startindex<0?0:i-startindex;
if( testlist.subList(start, testlist.size()).size()>0){
for (Integer integer : testlist.subList(start, testlist.size())) { //切割后得到的list为 testlist.subList(start, testlist.size())
System.out.print("qiege2="+integer);
}
}
System.out.println();
break;
}else{
for (Integer integer : testlist.subList(i-startindex,i)) { //切割后dedao的list为 testlist.subList(i-startindex,i)
System.out.print("qiege2="+integer);
}
System.out.println();
}
i=i+startindex;
}
很简单,自己记录一下,欢迎提出好的建议。