java 从sqlserver中读取大数据插入到access 内存溢出

微风无声 发布于 2014/07/09 11:05
阅读 842
收藏 0

我用java Swing做了一个数据采集工具,主要用途就是从sqlserver,mysql,oracle中读取数据然后插入到access中,用的是jdk1.6(32)  连接access用的是纯jdbc驱动 ucanaccess ,小数据量没问题,当数据量超过几十万级时就报内存溢出了,用jdk1.6(32)大概十万条数据以内就内存溢出,用jdk1.7(32)大概能读三十多万就溢出了,而用jdk7(64)都读了七十多万也没溢出,但是我做的采集功能以后主要用在32位机器上,程序大致思路是:方案1,先连接sqlserver读取其中一张表(大概62万)到全部数据,然后批量向access中插入(每次500条,越插越慢最后溢出);方案2:就是连接sqlserver之后分批读取数据(62万),每次读取5000条,然后批量插入access(每次500),最后也溢出;

请问,如何在32位机器上,控制jvm的内存,要保证不会出现内存溢出,程序运行时间长一点没问题。

加载中
0
len
len
应该是没有问题的,问题是你读来的数据难道都放内存里了?如果是读500,插入到access里,提交,重新读应该不会有问题。jdk 不同初始给你的内存空间也不同,所以读取的最大记录也不同,真正的问题还是内存泄漏,用jvisualvm查一查,看看哪一块增长的最快。另外也可以仔细检查下你的代码多半有全局的集合变量在增长
0
微风无声
微风无声
谢谢提醒,我查一下!
0
xiaoE7
xiaoE7
我做过大数据量批处理每次插入5000条没问题。我用的是框架mybatis
0
微风无声
微风无声
我做的是个桌面应用,在64位机器上没问题,32上受jdk限制,内存溢出。
0
Jack_Q
Jack_Q

引用来自“len”的评论

应该是没有问题的,问题是你读来的数据难道都放内存里了?如果是读500,插入到access里,提交,重新读应该不会有问题。jdk 不同初始给你的内存空间也不同,所以读取的最大记录也不同,真正的问题还是内存泄漏,用jvisualvm查一查,看看哪一块增长的最快。另外也可以仔细检查下你的代码多半有全局的集合变量在增长

+1

不要一次读取全部的sql server数据,分批读取。

0
常翔
常翔
读数据没溢出,插入的时候溢出了只能说插入的程序有问题   多半有全局的集合变量在增长+1
0
微风无声
微风无声
各位,此问题已经解决了,用的是jackces  里面有工具类可以直接把一个rs 中的数据插入到access中,内存很稳定,不会溢出。
0
微风无声
微风无声
非常感谢,各位的积极参与,希望有新的想法也及时说出来,大家共同研究。
0
tinshen
tinshen

你所谓的大数据。是一次读70w还是分批读。

如果一次读70w溢出的几率是机器高的。

给你最简单的方法就是分页插入到ACCESS中。


返回顶部
顶部