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

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
呵呵