CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

取记录集失败:用尽的Resultset!!!!这是怎么回事???

楼主Andrawu(晓彬)2002-09-28 18:09:36 在 Java / J2SE / 基础类 提问

jsp访问oracle数据库时,若数据量很多的话,就会报这个错误  
  到底是怎么回事啊?  
  兄弟最近才碰到这种错误?有无高手帮忙解释一下???  
  另外,还有个问题  
  我使用的是连接池访问,  
  由于有的jsp界面因为数据量很多,数据取出需要近1分钟的时间(在这段时间内,后台bean保持着一个connect,循环执行statement.execQuery)  
  但如果这时候另外一个操作用户也点击了这个jsp界面的相同操作的话,就会中断前者jsp界面的读取,报错:jsp   servers()   error:   soket   writer   error什么的?  
   
  代码类似:  
          ResultSet   result   =   null   ;  
          Statement   stmt   =   conn.getConnection.createStatement()   ;  
          for   (i=0;   i<20;   i++   ){        
  for   (k=0;   k<5;   k++)          
  for(j=0;   j<5;   j++){        
          String   sSql   =   "select   sum(num)   from   example   "  
          result   =   stmt.executeQuery(sSqlStr)   ;  
                          if   (result.next())  
  result.getLong(1)   ;  
                      }        
        }    
   
   
  在代码运行时出现极不稳定的情况,如果循环的次数较多的话(大约共循环100次左右),  
  有时候出现"用尽的ResultSet"或"关闭的语句",但有时候又没有错误。  
   
  如果循环的次数较小(大约共循环20次左右)就不会出现  
  任何现象。  
   
  我将以上代码改为以下现象也不行。  
            int   i,j,k   ;  
          String   sSql   =   "select   sum(num)   from   example   "  
          ResultSet   result   =   null   ;  
          PreparedStatement   pstmt   =   conn.getConnection.createPrepareStatement(sSql)   ;  
          for   (i=0;   i<20;   i++   ){        
  for   (k=0;   k<5;   k++)          
  for(j=0;   j<5;   j++){        
          result   =   pstmt.executeQuery()   ;  
                          if   (result.next())  
  result.getLong(1)   ;  
                      }        
        }    
   
  有哪位兄弟姐妹碰到过这种问题?帮忙解释一下如何?  
  分不够再加!!只要有人说得有点对也有分!  
  问题点数:200、回复次数:28Top

1 楼zhouwj(阿杰)回复于 2002-09-28 18:15:25 得分 10

JDBC的版本是多少的?1.2的话stmt好像最多用6~7次,最好用一次关一次。  
  你的Stmt没有关闭啊。这是大忌啊。  
  记录数多少不是大问题的。  
  Top

2 楼Andrawu(晓彬)回复于 2002-09-28 18:17:32 得分 0

jdbc为oracle中的classes12.zip,stmt在程序运行完后是关闭了的。  
  这里没有写出来。Top

3 楼wjmmml(笑着悲伤)回复于 2002-09-28 18:32:12 得分 70

 
          ResultSet   result   =   null   ;  
          Statement   stmt   =   conn.getConnection.createStatement()   ;  
          for   (i=0;   i<20;   i++   ){        
  for   (k=0;   k<5;   k++)          
  for(j=0;   j<5;   j++){    
  stmt=null;//初始化stmt对象。  
          String   sSql   =   "select   sum(num)   from   example   "  
          result   =   stmt.executeQuery(sSqlStr)   ;  
                          if   (result.next())  
  result.getLong(1)   ;  
  result.close();//查询后就把rs关闭  
                      }        
        }Top

4 楼wjmmml(笑着悲伤)回复于 2002-09-28 18:34:40 得分 0

一定要注意,rs用完后要关闭,你每次循环都没有关闭rs,当然会把rs用尽了。还有就是stmt也应该在每次使用前,初始化。  
  按我上面给你的代码处理,就不会有问题了。Top

5 楼wjmmml(笑着悲伤)回复于 2002-09-28 18:38:10 得分 0

http://www.csdn.net/expert/topic/1061/1061968.xml?temp=.3612482Top

6 楼IronPromises(铁诺)回复于 2002-09-28 18:41:38 得分 30

同意wjmmml(笑着悲伤)   的意见。  
  而且最后connection也是一定要关闭的。否则运行一段时间connection   pool就被占满了。  
  stmt最好也要关闭。  
   
   
  ResultSet   result   =   null   ;  
          Statement   stmt   =   conn.getConnection.createStatement()   ;  
          for   (i=0;   i<20;   i++   ){        
  for   (k=0;   k<5;   k++)          
  for(j=0;   j<5;   j++){    
  stmt=null;//初始化stmt对象。  
          String   sSql   =   "select   sum(num)   from   example   "  
          result   =   stmt.executeQuery(sSqlStr)   ;  
                          if   (result.next())  
  result.getLong(1)   ;  
  result.close();//查询后就把rs关闭  
                      }        
        }  
        stmt.close();//先关stmt  
        conn.close();//conn是一定要关闭的  
  Top

7 楼jimok(Jim)回复于 2002-09-29 01:07:48 得分 5

我觉得把for里面的程序写成一个方法,然后调用会不会好点呢,这样java的回收机制就可能用得更好,而且那段代码java可能先放在内存中,如果不调用才释放,如果经常调用可能就不释放先,这样就不用考虑关闭等问题了,因为它的生存期只在方法中。知道我再说什么吗?  
  public   long   forselect(){  
          Statement   stmt   =   conn.getConnection.createStatement()   ;  
          String   sSql   =   "select   sum(num)   from   example   "  
          result   =   stmt.executeQuery(sSqlStr)   ;  
          if   (result.next())  
  return   result.getLong(1);  
            }else{  
                    return   "";  
            }  
  }Top

8 楼wjmmml(笑着悲伤)回复于 2002-09-29 08:48:52 得分 0

楼上的说法不对,你上面的写法,和楼主的是一样的,都没有关闭rs,方法和代码没有区别,不是说,你写成方法了,jvm就能在你没次调用前就初始化rs的,必须关闭rs和stmt,哪怕是就一次查询。这是严格的要求,如果你不信,可以那你的代码做一下测试。多次运行后,,一定和楼住的情况一样。Top

9 楼pzl686(阿虎)回复于 2002-09-29 09:06:16 得分 0

连接池怎么用呀,能不能把你的代码发给我看看。谢谢  
  pzhaolong@hotmail.comTop

10 楼houniao(候鸟)回复于 2002-09-29 09:27:50 得分 5

巧了,我最近也在写这个东西,原因可能和楼上的wjmmml(笑着悲伤)和    
  IronPromises(铁诺)一样,就是你的statement和result在查询完之后没有关闭,还有数据库连接也要关闭。不过想请教一下两位,result和stmt一定要初始化嘛?我觉得好象不初始化也没多大影响啊?等待!!!!!!!!!!!!!!!!!!  
   
  Top

11 楼wjmmml(笑着悲伤)回复于 2002-09-29 09:38:55 得分 0

当你重复使用时,就要把他初始化,所谓stmt初始化就是复给null。对于rs就要关闭后在使用。  
  Top

12 楼Andrawu(晓彬)回复于 2002-09-29 09:57:12 得分 0

现在出现一个问题,按楼上的这样做,速度上很慢,而且一个在运行,另一个  
  根本就进不了该系统,而且还出现"关闭的语句"错误。  
  出错地方因result   =   stmt.executeQuery(sSqlStr)   ;只有在两个同运行时才出这个问题。一个运行是没有问题的。  
  Top

13 楼careless(Java.NET)回复于 2002-09-29 10:09:31 得分 0

resultSet关不关无所谓,stmt不必初始化,你的这段程序没有问题。  
  建议贴出全部程序。  
  Top

14 楼sandsworlf(30功名尘与土,8k里路云和月......)回复于 2002-09-29 10:17:11 得分 10

to:Andrawu(晓彬)  
  你在/usr中建立java目录,然后在java目录中建立jdbc目录,然后把classes.zip   放到里面  
   
  我的jdbc和oracle连接是oracle中的classes111.zip   不是classes12.zip  
  我的没有出现那种现象,你把oracle   中的jdbc中的classes111.zip   放到  
  classpath中  
   
  classpath=/usr/java/jdbc/classes111.zipTop

15 楼houniao(候鸟)回复于 2002-09-29 10:17:29 得分 0

再问wjmmml(笑着悲伤),如果不对result和stmt进行初始化,而进行重复使用,会产生什么后果呢?Top

16 楼careless(Java.NET)回复于 2002-09-29 10:18:16 得分 0

最好贴出源程序,有助于找原因。  
  conn是什么类型的对象?conn取出的Connection对象最后关闭了没有?stmt最后关闭了没有?为什么写那么多嵌套的for循环?Top

17 楼sandsworlf(30功名尘与土,8k里路云和月......)回复于 2002-09-29 10:19:43 得分 5

to:Andrawu(晓彬)  
   
  谢谢你以前帮我不少忙  
   
  上面一句话说错了,  
  你在/usr中建立java目录,然后在java目录中建立jdbc目录,然后把classes111.zip   放到里面Top

18 楼aben456(金珠MERP)回复于 2002-09-29 10:26:34 得分 0

连接池不就是不要关闭的么Top

19 楼careless(Java.NET)回复于 2002-09-29 10:30:47 得分 0

to   aben456(风轻扬)   :  
  同意!所谓的关闭就是将Connection释放回connection   pool。Top

20 楼nkjoshua()回复于 2002-09-29 11:11:39 得分 0

我以前经常犯这个错误  
  结果的一个个检查结果集等有没有关闭Top

21 楼Andrawu(晓彬)回复于 2002-09-29 11:21:37 得分 0

现在问题是一个人访问没有问题,两个同时访问就会出现"关闭的语句"错误。出错地方因result   =   stmt.executeQuery(sSqlStr)   ;  
   
  哎,看样子是搞不定了:(  
  帮忙帮忙,如果搞定再给200分。Top

22 楼careless(Java.NET)回复于 2002-09-29 11:35:57 得分 50

很怪,两个人同时访问,应该不会相互影响。  
   
  1、确认连接池运转正常,具有空闲连接。(查看你连接池的log文件)  
  2、确认jsp中无<jsp:useBean>的scop属性是application的bean实例。  
  3、确认jsp中无<%!   %>定义的变量。  
   
  另外,你用的数据库driver是JDBC第四类驱动吗?Oracle   的四类驱动包最新版本为:classes12.jar  
  Top

23 楼careless(Java.NET)回复于 2002-09-29 11:43:23 得分 0

很希望你把源程序贴出来!!我们帮你找找原因  
   
  因为按你贴的程序在我的机器里运行正常(数据库表和字段不同),而且我把循环变量   i   改成了循环100次,而且同时打开3个IE窗口访问该页面。Top

24 楼Andrawu(晓彬)回复于 2002-09-29 11:57:08 得分 0

谢谢楼上的这么有耐心帮我测试,十分感激!  
  1、确认连接池运转正常,具有空闲连接。(查看你连接池的log文件)  
        连接池运转正常,其实在程序运行过程中始终都是用的是一个连接,是  
  从连接池中取出来的,连接池是我们自己写的。应该还有空闲连接的。  
  没有log文件,但信息可以从后台输出。  
   
  2、确认jsp中无<jsp:useBean>的scop属性是application的bean实例。  
        没有。  
  3、确认jsp中无<%!   %>定义的变量。  
        没有。  
   
  另外,你用的数据库driver是JDBC第四类驱动吗?Oracle   的四类驱动包最新版本为:classes12.jar  
    用的是oracle中自带的classes12.zip。  
   
  程序代码比较繁琐,其实三个循环是在参数的。不便在此帖出。  
  等过一断时间,可以帖出错误信自己   。  
   
  Top

25 楼coin_age(抱抱,就一下)回复于 2002-09-29 13:41:42 得分 5

我有这样一个怀疑,从你所说的单用户没有问题来看  
  会不会是你的两个用户用用的是同一个connection实例啊  
  这样用户A正在用着的connection又被B用了  
  A这边才会出错,建议仔细检查一下你们的连接池程序  
  Top

26 楼shekarry(较好)回复于 2002-09-29 14:22:01 得分 0

多个人同时访问数据库时要定义多个Connection,每个操作与自己的  
  Connection对应。检查一下程序是否有这样的错误,不妨试一下Top

27 楼rujor(rujor)回复于 2002-09-29 17:26:53 得分 5

你超过了resultset的界限,比如只有30个结果你访问了第31个,有时候不验证resultset的返回会造成这种情况。即没返回resultset.Top

28 楼hailong326(望尘莫及)回复于 2002-09-29 18:07:39 得分 5

我感觉还是程序有问题  
  很菜,帮不上什么忙  
  Top

相关问题

  • 取记录集失败:用尽的Resultset!!!!这是怎么回事???
  • 取记录集失败:用尽的Resultset!!!!这是怎么回事???help
  • ClientDataSet在QuickReport只能显示第一行记录,怎么回事?
  • Query.RecordCount=-1是怎么回事,里面有很多记录的呀?
  • dbgrid中记录无法删除,怎么回事
  • 记录集不支持更新是怎么回事啊?
  • ODBC驱动程序不支持动态记录集是怎么回事??
  • 这又是怎么回事啊????数据库添加记录的问题
  • 菜鸟问题,freeform只能显示一条记录,怎么回事啊
  • 表到22万多记录时,插入数据不进去了,怎么回事?

关键词

  • 连接
  • 数据库
  • 驱动
  • 界面
  • 用户
  • 数据
  • jsp
  • oracle
  • 连接池
  • resultset

得分解答快速导航

  • 帖主:Andrawu
  • zhouwj
  • wjmmml
  • IronPromises
  • jimok
  • houniao
  • sandsworlf
  • sandsworlf
  • careless
  • coin_age
  • rujor
  • hailong326

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo