sqlite插入一万多条数据会报内存溢出 该怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite插入一万多条数据会报内存溢出 该怎么解决相关的知识,希望对你有一定的参考价值。

内存溢出导致程序崩溃,也分是java层崩了,还是mysql崩了。如果是java层崩了,注意不要一次性加载太多的数据到内存,并且不在使用的数据要彻底放弃引用关系。java虽然是自动回收,回收的原则就是一个对象不再被持有,即引用计数为零。如果数据太大,可考虑临时文件。如果是mysql崩了,首先增加配置缓存。一般来说mysql是不容易崩的,特别是插入操作的时候。查询的时候如果查询结果记录集特别大,会导致一个查询需要使用很大的内存空间,这种是有问题的。而插入操作都是一条一条的执行,不会导致大内存的使用。如果仅仅是数据移植,也尽量不要用ORM框架,比如hibernate,mybatis这些东西,因为他们都有自己的缓存,直接使用JDBC比较好。 参考技术A 您好,很高兴为您解答: 不知道楼主是否有显式的去开启事务,如果有,那么插一定数量条记录就显式的结束一次事务 然后这样循环,直到所有记录都插入完。 这样既保证了速度(因为大批量插入启用了事务),也保证了安全(如果出错还可以回滚)

informix 锁表问题

最近在做个项目,需要一次性导入4W-5W条数据到informix数据库中,我写了个循环进行插入,当一条条插入的时候会报内存溢出,当一次插入18条时当插入到3w多条的时候程序就报 找不到表错误,这时候表被锁了,我不明白为什么就我一个人插入数据也会锁表,求解。

插入操作的代码如下:
..
..
StringBuffer sql = new StringBuffer();
PreparedStatement pst = null;
con.setAutoCommit(false);
int deal_index = 18;//一次性插入18条数据
int temp = deal_index;
//需要的数据保存在list中,里面保存4W到5W条数据
for (int i = 0; i < list.size(); i+=deal_index)
sql.delete(0, sql.length());
sql.append("set lock mode to wait 10");
pst = con.prepareStatement(sql.toString());
pst.executeUpdate();
sql.delete(0, sql.length());
for (int j = i; j < temp; j++)
sql.append("insert into au_newaccount values('").append(list.get(j)).append("',").append(type).append(");");

temp += deal_index;
if(temp >list.size())
temp = list.size();

pst = con.prepareStatement(sql.toString());
pst.executeUpdate();
Thread.sleep(10);

con.commit();
System.out.println("插入完成");
但是informix数据库刚建的,日志应该不会满啊

参考技术A 去掉informix日志后再试试

以上是关于sqlite插入一万多条数据会报内存溢出 该怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

informix 锁表问题

在java中上传文件出现内存溢出怎么解决

我要向数据库中插入多条数据,但是代码好像只能插入一条,插入多条会报错,说值过多,这个怎么解决啊:

Sqlite插入数据 内存不断增长怎么解决

Python语言 SQLite怎么用内存数据库解决插入数据时速度慢的问题?

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