使用mybatis批量插入报错“java.sql.SQLException: 无法从套接字读取更多的数据”

       在最近的一个需求当中,需要一次性插入4000多条数据,项目所用的框架为mybatis,oracle数据库中目标表的主键采用的是序列自增的方式。

      当数据量达到一定数量的时候,采用批量插入当然会比循环执行一次插入一条数据的性能要高,数据量越大这种差别也越大。使用mybatis连接oracle数据库传入List<>集合作为参数插入数据没什么问题。最开始我是一次性插入4000多条数据,在调用mybaits的方法时可以看到控制台的打印信息,但数秒种后会抛出“java.sql.SQLException: 无法从套接字读取更多的数据”的异常。起初我以为这会和数据表的序列出错有关,后来经过几次试验与查找资料,发现这就是一次性插入数据量过大而抛出的异常,因此我选择将这个List集合分为多个List集合,一次插入1000条,完成操作。

      具体代码如下:

    //获取所有的对象集合
	List allLyricalList = getLyricalList();
	//将数据每1000条插入一次
	List lyricalList = new ArrayList<>();
	for(Lyrical lyrical: lyricalList) {
		lyricalList.add(lyrical);
		if(lyricalList.size() == 1000) {
			lyricalDao.insertLyricalBatch(lyricalList);
			lyricalList = new ArrayList<>();
		}
	}
	//插入最后凑不满1000条的数据
	if(lyricalList.size() > 0) {
		lyricalDao.insertLyricalBatch(lyricalList);
	}

       另外,我在不同的数据库环境下测试过,有的数据库(指的是不同的服务器)是可以一次插入4000多条数据的,因此在这里除了代码的优化外,还与数据库本身的设置有关(这得看运维是怎么设置数据库了)。当然对于批量插入来说,还是不宜一次插入太多数据,据个人经验,一次大概在500~1000即可。

你可能感兴趣的:(数据库)