取记录集失败:用尽的Resultset!!!!这是怎么回事???
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




