数据量过大时使用批量入库, java分批算法
/**
* 工具类
* @author ryr
* @Date: 2019-09-04 11:17
*/
public class Common {
/** 默认每次提交数据量为 2100条 */
private static int PAGE_SIZE = 2100;
/**
* 批量提交方法
*
* @param dataList 要保存的数据
* @param batchInsertMapper dao接口
* @param pageSize 每次提交量
* @param <T> 对象类型
* @return 成功保存数量
*/
public static <T> int divideBatch(List<T> dataList, BatchInsertMapper<T> batchInsertMapper, int pageSize) {
if (dataList==null||dataList.isEmpty()) return 0;
PAGE_SIZE = (pageSize > 0 && pageSize < PAGE_SIZE) ? pageSize : PAGE_SIZE;
int total_pageNum = dataList.size()/PAGE_SIZE + (dataList.size()%PAGE_SIZE > 0 ? 1: 0);
int success_num = 0;
for (int i = 1; i < total_pageNum + 1; i++) {
List<T> insertData = divideBatch(i, PAGE_SIZE, dataList);
success_num += batchInsertMapper.insertOfBatch(insertData);
}
return success_num;
}
/**
* 批量提交方法(使用默认提交数量 2100)
*
* @param dataList 要保存的数据
* @param batchInsertMapper dao接口
* @param <T> 对象类型
* @return 成功保存数量
*/
public static <T> int divideBatch(List<T> dataList, BatchInsertMapper<T> batchInsertMapper) {
return divideBatch(dataList,batchInsertMapper,0);
}
/**
* 数据分批
*
* @param pageNum 提交页码
* @param pageSize 提交数量
* @param dataList 要保存的数据
* @param <T> 对象类型
* @return 返回分批数据
*/
private static <T> List<T> divideBatch(int pageNum, int pageSize, List<T> dataList) {
return dataList.subList((pageNum - 1)*pageSize, Math.min(pageNum * pageSize, dataList.size()));
}
}
BatchInsertMapper接口只有一个方法,实现这个接口
public interface BatchInsertMapper<T> {
int insertOfBatch(List<T> ts);
}