java 怎么把5万条数据分批插入数据到mysql,之前插1,2万没事, 多了就内存溢出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
追答一样的道理嘛,事务控制好了就行了,我只是举个例子,这个思路是对的。
参考技术A 1、加大Java可使的内存量、单次提交的条数再扩大些、扩大java连接数据库最大连接数都可以从量上来解决这个问题,但是想质的解决这样做是不好的。2、用存储过程,来解决大量数据的CRUD是最明智的选择。写个存储过程,把数据一千条或几条的传给存储过程,由存储过程去解析,然后CRUD就能从本质上解决这个问题了。
这也是为何电信运营商的数据库应中,都是大量的存储过程即pl/sql的原因了。
再思考下吧。 参考技术B 如此之多的数据可能会引起内存的溢出,即使你加大内存也是治标不治本的方法,我建议你使用java的缓存机制逐步的存取数据,你可以将数据先存放在缓存中,然后逐量插入数据库中,缓存可以使用Memcache追问
这个缓存在程序中哪里设置调用啊,还是说的是tomcat里的缓存啊
追答程序里面调用的,就像使用map是一样的效果,存放的时候是存放的键值对,类似于新开辟了一个磁盘空间出来用的
参考技术C 不管是map,还是Memcache都会消耗内存如果机器内存很大,你可以给虚拟机分配足够大的内存
如果你机器内存不大,就需要分批将数据读入到程序里,不要一次把3W的数据都读入到程序中
可以读1W插1W追问
我也想读1w插入1w,但是这个3w是变量,他可能偶尔一次就生成5000,我是拿大数据测试时发现的问题,这个分批有具体点的方法么...
追答数据如果是访问外部接口拿到的
开放的接口取数据一般是会有分页条件的。
如果是访问其他数据源拿到的
也可以利用分页条件。
如果是读文件拿到的
文件的话可以用BufferedReader来分批读取。
如果是别人推给你的
找推给你的人,不要一次性推给你过多的数据。
java100万条数据怎么查出重复
参考技术A 把数据表增加索引,提高查询效率,把数据排好序,测试查询速度,使用临时表保存排序好的数据,经过测试,处理插入100w条数据大概413秒,7分钟。以上是关于java 怎么把5万条数据分批插入数据到mysql,之前插1,2万没事, 多了就内存溢出的主要内容,如果未能解决你的问题,请参考以下文章