应用场景:
有10万条数据入库(mysql),不得不说mysql性能的确不如oracle呀,不是一个档次。
方案:
先按条件查出数据,放入list中,该list有大批量数据,在进行分开批量存储。
进行批量存储的时候,要对mysql的一个值进行更改:show VARIABLES like '%max_allowed_packet%';
默认是1M,在my.ini文件中修改为20M,这有个坑,网上大部分都是说修改,结果在文件中找了半天没找见,有点懵逼呀,后来就尝试的加了一下:
,加完后重启mysql,再次查询发现值发生了变化:
代码:
package com.eebbk.internal.question.convertor.util;
import java.util.ArrayList;
import java.util.List;
//工具类
public class AssignListUtils {
/**
* 将一组数据平均分成n组
*
* @param source 要分组的数据源
* @param n 平均分成n组
* @param <T>
* @return
*/
public static <T> List<List<T>> averageAssign(List<T> source, int n) {
List<List<T>> result = new ArrayList<List<T>>();
int remainder = source.size() % n; //(先计算出余数)
int number = source.size() / n; //然后是商
int offset = 0;//偏移量
for (int i = 0; i < n; i++) {
List<T> value = null;
if (remainder > 0) {
value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
remainder--;
offset++;
} else {
value = source.subList(i * number + offset, (i + 1) * number + offset);
}
result.add(value);
}
return result;
}
/**
* 将一组数据固定分组,每组n个元素
* @param source 要分组的数据源
* @param n 每组n个元素
* @param <T>
* @return
*/
public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {
if (null == source || source.size() == 0 || n <= 0)
return null;
List<List<T>> result = new ArrayList<List<T>>();
int sourceSize = source.size();
int size = (source.size() / n) + 1;
for (int i = 0; i < size; i++) {
List<T> subset = new ArrayList<T>();
for (int j = i * n; j < (i + 1) * n; j++) {
if (j < sourceSize) {
subset.add(source.get(j));
}
}
result.add(subset);
}
return result;
}
public static void main(String[] args) {
List<String> listString =new ArrayList<String>();
for (int i = 0; i < 100; i++) {
listString.add(i, "数据"+i);
}
List<List<String>> fixedGrouping = fixedGrouping(listString, 100);
System.out.println("共分为了"+fixedGrouping.size()+"组");
}
}
//中间层代码
int sizeList = questionXuekubaoList.size();
//将该集合以500条数据分为N个集合,分开存储
List<List<QuestionXuekubaoPojo>> fixedGrouping = ········AssignListUtils.fixedGrouping(questionXuekubaoList, 500);
if (CollectionUtils.isNotEmpty(fixedGrouping)) {
Iterator<List<QuestionXuekubaoPojo>> iterator = fixedGrouping.iterator();
while (iterator.hasNext()) {
List<QuestionXuekubaoPojo> next = iterator.next();
questionMapper.insertQuestionXuekubaoBatch(next);
}
}
//mapper.java
int insertQuestionXuekubaoBatch(List<QuestionXuekubaoPojo> questionXuekubaoQueryPojo);
//mapper.xml,注意的是表中必须有个唯一约束
<insert id="insertQuestionXuekubaoBatch"
parameterType="com.eebbk.internal.question.convertor.pojo.QuestionXuekubaoPojo"
keyProperty="id" useGeneratedKeys="true">
replace into t_question_xuekebao_copy
(id_old,content, answer, solution,course,grade,pic_exist_flag,create_time)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.idOld},#{item.content},#{item.answer},#{item.solution},#{item.course},#
{item.grade},#{item.picExistflag},#{item.createTime})
</foreach>
</insert>