java 怎么把5万条数据分批插入数据到mysql,之前插1,2万没事, 多了就内存溢出

希望能有详细点的方案,扩大 内存,之前用过了,所以从10000变成20000,我用的是spring mvc和mybatis

我把30000w数据放到一个数组pws[]了,想如果分批,难道要在把这数组拆开成多个数组,这样在插入么,想让指正思路,看看这个分成几批的次数,和剩下数据什么的怎么处理

你的事务控制问题。
大量数据插入的时候,可以将数据量分批,每次事务提交一批。
例如:
con.setAutoCommit(false);// 更改JDBC事务的默认提交方式
Statement stmt = conn.createStatement();
// 第一批 省略n条
stmt.addBatch("insert into dept values (52,'a','aa')");
stmt.addBatch("insert into dept values (53,'b','bb')");
stmt.addBatch("insert into dept values (54,'c','cc')");
stmt.executeBatch();
con.commit();//提交JDBC事务
stmt.close();

// 第二批 省略n条
stmt = conn.createStatement();
stmt.addBatch("insert into dept values (52,'a','aa')");
stmt.addBatch("insert into dept values (53,'b','bb')");
stmt.addBatch("insert into dept values (54,'c','cc')");
stmt.executeBatch();
con.commit();//提交JDBC事务
stmt.close();
// 第n批
。。。。。。
con.setAutoCommit(true);// 恢复JDBC事务的默认提交方式
conn.close();追问

我用的是spring mvc+mybatis

追答

一样的道理嘛,事务控制好了就行了,我只是举个例子,这个思路是对的。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-21
1、加大Java可使的内存量、单次提交的条数再扩大些、扩大java连接数据库最大连接数都可以从量上来解决这个问题,但是想质的解决这样做是不好的。
2、用存储过程,来解决大量数据的CRUD是最明智的选择。写个存储过程,把数据一千条或几条的传给存储过程,由存储过程去解析,然后CRUD就能从本质上解决这个问题了。
这也是为何电信运营商的数据库应中,都是大量的存储过程即pl/sql的原因了。
再思考下吧。本回答被网友采纳
第2个回答  2013-07-16
如此之多的数据可能会引起内存的溢出,即使你加大内存也是治标不治本的方法,我建议你使用java的缓存机制逐步的存取数据,你可以将数据先存放在缓存中,然后逐量插入数据库中,缓存可以使用Memcache追问

这个缓存在程序中哪里设置调用啊,还是说的是tomcat里的缓存啊

追答

程序里面调用的,就像使用map是一样的效果,存放的时候是存放的键值对,类似于新开辟了一个磁盘空间出来用的

第3个回答  2013-07-16
不管是map,还是Memcache都会消耗内存
如果机器内存很大,你可以给虚拟机分配足够大的内存
如果你机器内存不大,就需要分批将数据读入到程序里,不要一次把3W的数据都读入到程序中
可以读1W插1W追问

我也想读1w插入1w,但是这个3w是变量,他可能偶尔一次就生成5000,我是拿大数据测试时发现的问题,这个分批有具体点的方法么...

追答

数据如果是访问外部接口拿到的
开放的接口取数据一般是会有分页条件的。
如果是访问其他数据源拿到的
也可以利用分页条件。
如果是读文件拿到的
文件的话可以用BufferedReader来分批读取。
如果是别人推给你的
找推给你的人,不要一次性推给你过多的数据。

第4个回答  2013-07-16
关注ing...
相似回答