致板桥:关于"查询数据库后是返回ResultSet还是返回Collection?"的几点问题

03-03-28 experience

看了板桥的"查询数据库后是返回ResultSet还是返回Collection?"有以下几个问题?

1.关闭Collection后ResultSet的可访问问题?

我的理解是:ResultSet自身并不持有数据, 它仅是在next()调用时从数据库取当前游标处的记录, 因此当connection关闭后,ResultSet一定不能使用.你以前关闭Connection后仍能使用ResultSet是因为你可能使用了连接池, 这样你调用Connection.close()时, 实际上系统没有真正的关闭联接,它只是被收回联接池,物理的数据库连接仍然存在, 故你之后能使用ResultSet.

这样按你所示例的方式时就有很大的安全问题, 因为在你返回ResultSet时 , connection已经Close(),即connection交由连接池管理器管理, 在最坏的情况下, 如果连接池管理器管理关闭了你刚才释放的Connection,ResultSet使用时就会发生问题.这种情况有很大的不确定性.

2.statement的浪费问题.

我们知道, 在使用JDBC时不仅Connection占用数据库资源,Statement也同样占用数据库资源.

当用你用Statement返回ResultSet之后,为了确保ResultSet能够在iterator中正常工作, 你肯定不能关闭Statement.因为当Statement关闭时, 会自动关闭它所创建的ResultSet.这一点不管是Statement还是PrepareStatement都遵循.(JDK document中可查到.)

banq
2003-03-28 16:03

你说的非常对,目前我们已经有确认,返回ResultSet是不安全的。

目前焦点是返回Collection还是返回Iterator.这两种应该各有优缺点。

experience
2003-03-28 20:03

用Iterator包装ResultSet和直接返回ResultSet有什么区别?

我感到很因惑:通过包装ResultSet而返回iterator与直接返回ResultSet会遇到同样的安全问题.而将数据直接放入collection然后返回collection.iterator()与直接返回collection是等价的.

那么我想问,现在返回Collection与iterator又有什么区别吗?