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

2024-11-24 03:41:49
推荐回答(5个)
回答1:

你的事务控制问题。
大量数据插入的时候,可以将数据量分批,每次事务提交一批。
例如:
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();

回答2:

1、加大Java可使的内存量、单次提交的条数再扩大些、扩大java连接数据库最大连接数都可以从量上来解决这个问题,但是想质的解决这样做是不好的。
2、用存储过程,来解决大量数据的CRUD是最明智的选择。写个存储过程,把数据一千条或几条的传给存储过程,由存储过程去解析,然后CRUD就能从本质上解决这个问题了。
这也是为何电信运营商的数据库应中,都是大量的存储过程即pl/sql的原因了。
再思考下吧。

回答3:

如此之多的数据可能会引起内存的溢出,即使你加大内存也是治标不治本的方法,我建议你使用java的缓存机制逐步的存取数据,你可以将数据先存放在缓存中,然后逐量插入数据库中,缓存可以使用Memcache

回答4:

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

回答5:

关注ing...