java 数据库查询 OutOfMemoryError

ucoplay 2008-09-01 09:18:36
有一条sql语句,直接在数据库提供的查询工具里面进行查询的话,正确并显示有20000多条数据。但是在用java写的程序里面执行的话,会产生OutOfMemoryError.使用java -Xmx100m MyApp就可以正确的执行。但是这个javabean是要传到服务器上运行的,使用tomcat,在jsp页面调用这个javabean就会出错。使用的是sybase数据库,如果在sql语句里加上set rowcount 100的话,就不会产生错误,但也只能返回前100条记录。
想请问下有什么办法可以在不增加java 虚拟机的内存的前提下,正确的执行sql语句,比如先查询前200条语句之类的?baidu上没找到,csdn也没找到相关的办法,希望大家可以帮下忙。
...全文
297 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ever_li 2008-09-10
  • 打赏
  • 举报
回复
你是不是一定要一下子取得所有的数据程序才能继续处理?如果不是的话,分成多个批次取得数据然后处理,处理完了再去的下一批(类似于分页)
foundercy_weng 2008-09-08
  • 打赏
  • 举报
回复
tz_dzg 2008-09-08
  • 打赏
  • 举报
回复
调用存储过程可能帮你提供一些思路
colinTongzw 2008-09-05
  • 打赏
  • 举报
回复
不觉得多次请求性能,多次请求的性能是一个二次函数,合理的一次请求条数会提高不少性能,
如果用xml对接的方法,大数据量上估计时间效率很差
老紫竹 2008-09-02
  • 打赏
  • 举报
回复
你可以用ResultSet 逐个的移动游标啊。这个游标是服务器端的,不占用本地内存。
但是如果你要把那么多的数据一次性读取到内存里,那肯定要占用太多的内存了。
正确并显示有20000多条数据
2万条,我想你有3个方法解决
1 直接把ResultSet 传给显示代码,这样虽然丑陋,但有效
2 分多次查询,每次1000条,虽然看着很好,但性能极差
3 把查询结果用指定格式保存到临时文件里面,比如用xml,然后显示部分直接对xml文件进行操作。
正规开发推荐第三种。简单有效。
我自己用,肯定用第一种,我注重结果,管它什么规范。
hanbb 2008-09-02
  • 打赏
  • 举报
回复
查询时去掉不用的字段,尽量不要查询大字段\
笨沙发 2008-09-02
  • 打赏
  • 举报
回复
我感觉是你代码写的有问题,贴出来看看
huangyangweiyue 2008-09-02
  • 打赏
  • 举报
回复
关注下这问题的解决办法。
帮你顶下
  • 打赏
  • 举报
回复
这是个头疼的问题~~~
ucoplay 2008-09-02
  • 打赏
  • 举报
回复
感谢以上几位。
ucoplay 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 java2000_net 的回复:]
你可以用ResultSet 逐个的移动游标啊。这个游标是服务器端的,不占用本地内存。
但是如果你要把那么多的数据一次性读取到内存里,那肯定要占用太多的内存了。
正确并显示有20000多条数据
2万条,我想你有3个方法解决
1 直接把ResultSet 传给显示代码,这样虽然丑陋,但有效
2 分多次查询,每次1000条,虽然看着很好,但性能极差
3 把查询结果用指定格式保存到临时文件里面,比如用xml,然后显示部分直接对xml文件进行…
[/Quote]
直接传ResultSet肯定是不行了,因为就是ResultSet里面的数据量大了引起的OutOfMemory错误。20000条数据大概占用了100M的数据。而且这个查询可能查询的结果会更大,20完的数据也是可能的。只要执行全部数据的查询,而不是只查询一部分的话,就会出现错误。
分多次查询确实好像是现在唯一的方法了,但是就Sybase好像没有提供每条记录的行号,也就是说无法定位到要查询第N到N+M条数据。
至于第三种,确实不会,而且现在的主要问题应该是解决ResultSet占用内存过大而引起的OutOfMemory错误。
ucoplay 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mcm_guy 的回复:]
我感觉是你代码写的有问题,贴出来看看
[/Quote]
String sql=mySqlSting;
ResultSet rs = DbAgent.SQLQuery(mySqlString);
然后就是OutOfMemoryError.
就是返回的rs里面的数据量多了就会提示这个错误,数据量少的时候一切正常.
ucoplay 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 songbeirui 的回复:]
可能你表字段过多,或有大字段造成.建议你只返回你需要用到的数据字段.
[/Quote]
返回的确都是需要用的字段。
songbeirui 2008-09-01
  • 打赏
  • 举报
回复
可能你表字段过多,或有大字段造成.建议你只返回你需要用到的数据字段.

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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