1)利用每个对象各自的内存cache(当然现在ORM,CMP都有可以)
2)复用客户端代码(现在看来也土了)
to mellon:即使用连接池,如果返回池中的连接被继续引用使用必定会抛出异常,和已关闭的没什么区别,再SB的连接池实现也会做到这一点。
对于性能,我也决得那句话说得好:只在必要的时候进行优化。不过jive的这个优化是非常有意义的,大大的提高并发性能。
to mellon:即使用连接池,如果返回池中的连接被继续引用使用必定会抛出异常,和已关闭的没什么区别,再SB的连接池实现也会做到这一点。
对于性能,我也决得那句话说得好:只在必要的时候进行优化。不过jive的这个优化是非常有意义的,大大的提高并发性能。
楼主之所以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访问数据库,这样的设计真让人泄气,除非有各种工具自动生成大段代码,否则开发人员都得累死!
public void hasNext() {
if (next == null) {
if (! rs.next()) {
return false;
}
next = rs.getString(1);
}
return true;
}
上述代码中的方法声明应该改成public boolean hasNext(),这样return true/false才可以正常工作的。:p
我现在使用SLSB + JDBC做一些数据库访问,返回的是数据ID集合,注意不是整个记录的集合,相关原理见:
谢谢你!banq!
为了模式性能上是要付出代价的。
如果直接返回对象数组(此处为字符串),和返回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;
}
...