日期:2014-05-16  浏览次数:20483 次

MyBatis+Spring批量插入简单方式

因为整合spring,所以常用的方式很麻烦

于是从SQL下手,利用

INSERT INTO [TABLE]([FIELD],[FIELD]...)VALUES([VALUE],[VALUE]...),([VALUE],[VALUE]...)...
这个SQL来做文章了

但是,在一条命令SQL引擎默认是一次最多插入1000笔记录,最多2100个字段参数,一次处理海量数据容易引起

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.

The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values. 

2个错误,所以插入的时候还要处理一下

	public int insertPartList(List<Part> parts){
		int rs=0;
		for(int i=0,s=0;i<parts.size()/117;i++,s+=117)
			rs+=getSqlSession().insert("insertPartList",parts.subList(s,s+116));
		if(parts.size()-parts.size()/117*117>0)
			rs+=getSqlSession().insert("insertPartList",parts.subList(parts.size()/117*117,parts.size()));
		return rs;
	}

循环处理,然后结尾处理即可,其中数字是看情况的
本人用的算法如下

数字=2100/表字段数量
if(数字>1000)
	数字=1000;
写完了,117这个数字测试10k条数据

	public static void main(String[] args) {
		PartDao partDao=(PartDao)new ClassPathXmlApplicationContext("configuration/spring.xml").getBean("PartImpl");
		List<Part> parts=new ArrayList<Part>();
		for(int i=0;i<10000;i++){
			Part p=new Part();
			p.setRid("r"+i);
			parts.add(p);
		}
		Function f=new Function();
		System.out.println(f.getDateTime(new Date()));
		partDao.insertPartList(parts);
		System.out.println(f.getDateTime(new Date()));

	}

在虚拟机里用了4s,效果还行,不过没C#的SqlBulkCopy秒杀100k条犀利

1楼llhhyy19893天前 11:51
呵呵