其实jive代码并不没有封装引用result set(2.5.3source),是不是误解了?他是将要装入对象的ID数组,传入iterator,主要的好处
1)利用每个对象各自的内存cache(当然现在ORM,CMP都有可以)
2)复用客户端代码(现在看来也土了)

to mellon:即使用连接池,如果返回池中的连接被继续引用使用必定会抛出异常,和已关闭的没什么区别,再SB的连接池实现也会做到这一点。

对于性能,我也决得那句话说得好:只在必要的时候进行优化。不过jive的这个优化是非常有意义的,大大的提高并发性能。

如果读者不看这篇文章的讨论,而只看文章本身,一定害人不浅!
我不同意Banq文章中的观点。
不错,使用jdbc后,一定要按照顺序依次关闭各个对象:
rs.close-> statement.close -> connection.close();
关闭connection后,connection对象已经消失,派生的statement 和rs 亦会消失, 所以rs 决不可能再使用。
他们是互相依赖的。
(这是一个概念性问题。
如果你做过数据库的 c 调用,其中的原理是显而易见的。)
楼上几位的回复还是最后纠正了楼主的谬误,抹一把汗,庆幸庆幸。。
但是如果有人只看了主贴而没有看回贴的话实在是非常危险。

楼主之所以ResultSet在Connection关闭之后依然能使用,是因为使用了线城池,Connection只是被返回到线程池,并没有真正被关闭。并且大概楼主的程序并发访问数应该不是很大(估计只有几个人同时访问),因此返回的Connection没有立刻被其他线程征用,所以暂时resultset依旧能操作。

这是JDBC的最基本规则,希望楼主多研究java的一些基本东西。

在JDBC optional Package中有一个新的接口javax.sql.RowSet(继承了ResultSet),有一种CachedRowSet的实现,其中的数据经过了缓存,即使在Connection关闭后依旧能访问,有助于解决这个问题。
具体例子参见JSP页面查询显示常用模式

ps.即使在MVC模式中也并没有禁止View直接访问Model,只是将业务逻辑封装进Model,View完成显示逻辑,Controller用于选择需要显示的View。

因此在一个系统内部(不是系统间的分布式访问场合)jsp中直接使用sql taglibs查询显示数据才是最快速、高效(无论是在开发时间上还是数据传输速度上)的方法。而如果在一个系统内部jsp/servlet却还需要通过各种delegate/dao/ejb再通过rmi访问数据库,这样的设计真让人泄气,除非有各种工具自动生成大段代码,否则开发人员都得累死!

关于Connection,Statement,ResultSet接口的定义,建议banq看看sund的jdbc的规范是怎么写的。
关于iterator,collection:
iterator是一个容器用于外部遍历的一个模式,几乎任何容器都提供了iterator,collection也不例外
我这里针对banq的示例代码中作一个小的纠正。不过我首先声明,banq的代码是很精妙的,瑕不掩瑜!!!

public void hasNext() {
if (next == null) {
if (! rs.next()) {
return false;
}
next = rs.getString(1);
}
return true;
}

上述代码中的方法声明应该改成public boolean hasNext(),这样return true/false才可以正常工作的。:p

为什么不用RowSet,从数据库中得到ResultSet后转为RowSet,这样就不存在数据库关闭问题了
RowSet是一个离线数据集,不知他的性能怎样?
benq的方法是值得商榷的。如果你要关闭数据库对象后依然使用resultset的特性,sun提供了cachedResultSet类,但是不适合大数据表。对于datamap的问题,特别是数据量巨大的应用,没有最好的解决方法,要么消耗数据库的资源,要么消耗app的资源。
这是以前MySQL驱动的一个Bug,我已经在其它帖子里申明了,今天才看到这个帖子,感谢大家的纠正。
当时我未详细查询API,JDK API有申明,resultSet在关闭时被清除了。

我现在使用SLSB + JDBC做一些数据库访问,返回的是数据ID集合,注意不是整个记录的集合,相关原理见:

http://www.jdon.com/product/muiltipagequery.htm

人无圣人啊!!
无论怎样,都应该感谢banq愿意和我们分享他的知识!!

谢谢你!banq!

如果我没有理解错的话。当jsp遍历id时,根据id决定是从缓存中找,还是从数据库中找,那么当缓存中没有当前页面的任何id时将全部从数据库中找,如果要遍历20个id就访问20次数据库吗?
如果不是为了模式,用resultset遍历是最快的,比放进Collection在遍历要快很多,装进Collection不也是resultset的遍历吗。在jsp中遍历resultset占用数据库资源的说法是不对的。jsp的后台实现就是servlet。

为了模式性能上是要付出代价的。

问个外行问题:
...
public List getUsers() {
ResultSet rs = userDbQuery();
List retval = new ArrayList();
while (rs.next()) {
retval.add(rs.getString(1));
}
return retval;
}
...

如果直接返回对象数组(此处为字符串),和返回Iterator比较,哪个效率更高?

...
public List getUsers() {
ResultSet rs = userDbQuery();
int length = rs.getFetchSize();
String[] retval = new String[length];
int j=1;
while (rs.next()) {
retval[j] = rs.getString(1)
j++;
}
return retval;
}
...