从数据库中取上千万条记录的问题

usa112233 2009-02-24 12:45:04
我要从数据库中取数据,大概有一千多万条记录,要把全部的结果保存到一个文件中,其中有个字段custName是存放姓名的,数据库的字符集是ISO-8859-1,要想得到中文还得做转换new String(rs.getString("custName").trim().getBytes("iso-8859-1"),"GBK");看了一些文章,说用new方法就又产生了一个对象,原来的对象所占的内存就只能等JAVA的垃圾回收机制处理了,所以我的程序一运行,内存就狂涨,取数的速度就不断慢下来了。请教各位高手,有什么好办法?
我的程序主要的部分如下:
sql="select * from kh";
String colvalue="";
rs=stmt.executeQuery(sql);
while(rs.next()){
for(int i=1;i<60;i++){
if(i!=3){
colvalue=rs.getString(i);
}else{
colvalue=new String(rs.getString("custName").trim().getBytes("iso-8859-1"),"GBK");
}
pw.print(colvalue+"|");
}
pw.println("");
}
rs.close();
另外,有没有办法可以判断String的值是不是中文?
...全文
512 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
liqing5944 2009-03-09
  • 打赏
  • 举报
回复
数据问题。。太多了机器会崩溃。
lzbang 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzhxxp 的回复:]
先坐上沙发,一千多万条记录在取的时候不要全部取出,要按一次取出多少条假如是50条,100条或200条,关闭链接,然后再取数据,这样你试试。
[/Quote]

UPUPUPUP
steryzone 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yihaijian1 的回复:]
是啥应用,有这么大的数据量呢...
[/Quote]
呵呵。。我也想知道呢。呵呵
cyberwjf 2009-03-09
  • 打赏
  • 举报
回复

sql="select * from kh";
String colvalue="";
rs=stmt.executeQuery(sql);
while(rs.next()){
for(int i=1;i <60;i++){
if(i!=3){
colvalue=rs.getString(i);
}else{
colvalue=new String(rs.getString("custName").trim().getBytes("iso-8859-1"),"GBK");
}
pw.print(colvalue+"|");

}
pw.println("");
// 你在打印完以后已经没有指向new出来的String的引用了,
// 所以你可以在这里加上主动调用垃圾收集的代码试试,我没测试过哦^-^
System.gc();
}
rs.close();
废穴S猫 2009-03-09
  • 打赏
  • 举报
回复
建议如下:
1、将现有的数据库中custName字段字符转换成GBK,这样获取时不用转码。应用系统中在保存记录时将custName存入GBK内容。
2、文件采用追加方式。
3、在pw.print(colvalue+"|"); 代码后增加“colvalue=null”。使gc时减少判断。
usa112233 2009-03-09
  • 打赏
  • 举报
回复
没人了吗?
jklot66 2009-03-09
  • 打赏
  • 举报
回复
你应该优化你的sql 让他在数据库中查询时一次查询50条或100条这样处理
还有String colvalue="";这个换成StringBuffer效果能好不少 你用String会产生大量的对象 占用你的内存
suncheng_hong 2009-03-09
  • 打赏
  • 举报
回复
不在new 的问题,在与 你没有分页。
我查了查 你的数据库是不是支持下面的分页语句。
select first n from TableName order by fieldName Asc
kym75 2009-03-09
  • 打赏
  • 举报
回复
学习了
jumpheightway 2009-03-09
  • 打赏
  • 举报
回复
就是对文件的操作
无须一次读多少也可以操作啊
一次搞定
就看你怎么操作这个文件了



专业培训:JAVA J2EE JSP PHP LAMP系列架构
联系QQ:492236022
usa112233 2009-03-04
  • 打赏
  • 举报
回复
高手们帮个忙啊
shuanlarousi1 2009-03-03
  • 打赏
  • 举报
回复
将数据分页,然后限制一次取出数据的记录数目,将一千万条记录分多次取出,这样可以减少内存的开销
usa112233 2009-03-03
  • 打赏
  • 举报
回复
有人关注吗?
usa112233 2009-02-27
  • 打赏
  • 举报
回复
分页的想法就不必了,必须一次性读取数据,只能想办法降低内存使用,提高执行效率了。
yzg000123 2009-02-27
  • 打赏
  • 举报
回复
我也遇到过数据很多的问题,记得就是用数据库分页查询的方法做的,
具体不太清楚,lZ可以看看这个,
http://www.blogjava.net/phe441/archive/2006/12/11/87042.html
usa112233 2009-02-27
  • 打赏
  • 举报
回复
那有没有办法判断一个字符串里有没有中文,这个字符串是用rs.getString()得到的,数据库字符集是ISO-8859-1
KAKUKYOWU 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 usa112233 的回复:]
请问初始内存如何设置?
[/Quote]

启动参数中加入:
-Xms256m -Xmx512m
usa112233 2009-02-26
  • 打赏
  • 举报
回复
请问初始内存如何设置?
sunnylyy 2009-02-26
  • 打赏
  • 举报
回复
顶18楼

这么多数据存在一个文件中,当然不能一次都取到内存中,把文件设置成可追加模式,一次取5000或者10000条,加到文件后面。执行1000次就有1千万了。嫌文件太大的话还可以把文件分成若干个小文件。

数据库不支持分页查询也不要紧,rs.next()一条一条过就可以了。另外不要使用CSV文件,它只能容纳65536行。
Coolfatman 2009-02-26
  • 打赏
  • 举报
回复
别理那些说分页的,完全是胡说八道,用个游标就可以解决的事,搞什么分页。

分页仅仅在取前几页的时候性能好。像你这样的数据量,取5万行以后的页数,每页花的时间和取全部数据的时间是相同的。

new是会产生对象,可是用完了也就可以回收了,内存增长是正常的,至于说速度慢下来,是你的初始内存设置过小,导致垃圾回收器不停的运作。只要把初始内存设大一点就行了。
加载更多回复(29)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧