ResultSet的问题 小弟以前是学.NET的,刚学JSP,有些不明白的地方想请教各位前辈利用JDBC访问数据库,使用查询返回ResultSet结果集。使用While(rs.Nest())遍历ResultSet的过程中,数据库连接释放了吗?是直接对数据库进行操作吗?还是像.NET的DataSet一样先将查询的结果集存放在本地,然后再对其进行操作? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用While(rs.Nest())遍历ResultSet的过程中,数据库连接释放了吗?——一般情况下,是不能释放的,释放了就没法next()了。是直接对数据库进行操作吗?——有预读的能力,但可以理解为直接对数据库操作。还是像.NET的DataSet一样先将查询的结果集存放在本地,然后再对其进行操作?——不是这种。但也有可以支持这种的,要用CachedRowSet,可以把数据先全部下载完毕。 非常肯定的告诉你,没有。在遍历结果集的时候,数据库连接如果断开,ResultSet将无法遍历数据,除非使用特殊的可缓存的结果集,实际java程序员都会用数据库连接池 来提高性能,也会将ResultSet的结果转换为VO对象缓存在另外的地方,这样就可以不依赖数据库连接。 谢谢两位高手解答是不是一般在做程序的时候都用CachedRowSet,如果用ResultSet的话,占用数据库连接,对数据库并发性要求高的情况下是不可取的。2L的前辈说将ResultSet转换为VO对象,我不太明白是什么意思,纯新手,请不吝赐教。 一般做程序的时候,都会用成熟的数据访问组件来处理数据库访问。那么数组访问组件会把查询的结果自动转换为 值对象类(VO),然后作为List返回,比如:List<Student>“如果用ResultSet的话,占用数据库连接,对数据库并发性要求高的情况下是不可取的”—— 我觉得你理解存在误区,使用ResultSet的过程是必然存在的,只要程序能最大可能缩短这个过程即可;前面所说的封装为VO,实际上也是循环读取ResultSet,然后转成VO的过程;虽然能稍微减少数据库连接占用时间,从总体开销上来说,消耗了更多的CPU时间;—— 你所说的.Net,它直接把结果集放入内存,必然也存在着循环遍历ResultSet将数据库所返回数据全部读取出来然后再放入内存的过程,只不过这个过程被封装好了,你不知道;—— 最后,某些情况下,占用数据库连接能有效降低内存开销,比如你开发一个程序,负责将数据库中的 壹佰万上记录导出成文件;这种情况下先把ResultSet内容放到内存中的做法显然是不可取的。 其实vo也是一个java bean。vo一般用来在不同的层之间传递数据,vo的主要作用是为了解耦,就是尽量减少不同层之间的耦合性。使用While(rs.Next())遍历ResultSet的过程中,数据库连接释放了吗?数据库连接是不能释放的,如果释放了,你就没法操作数据库了。是直接对数据库进行操作吗?我个人认为是直接操作数据库的。 VO就是值对象的意思,简单点来说,就一个特殊的类:它只负责保管各种属性,并不提供任何计算或处理能力。也有称:POJO比如:public class Student { private String name; private Date brithday; public String getName() { return this.name; } public void setName(String name) { this.name = name; } ...} 大牛们说得好,小弟认为上面的说法明确一下比较好,因为从数据库返回到本地可以有两种方式:一是一次性返回所有的结果集到本地(TCP拆包是另外的问题),二是每条记录都从数据库返回,是不同的网络请求。.net 的 DataSet个人理解是前者,参考http://developer.51cto.com/art/200910/159546.htm。 在给word文档建立索引的时候报错 为什么通过js输出的标签中的函数怎么带参数问题?大家帮忙解决以下 关于JXL导出后 的 跳转问题 JSTL标签<c:forEach>数据显示问题 请问怎么从程序中转发到另一个网址? 初次进入,散分! 下面程序是求系统当前日期是星期几,请问错再哪里?快没分了,帮帮忙吧 请问再jb9下编写的struts程序在tomcat下怎莫没法运行了? 请问在jsp中在打印机中打印,怎么写语句,谢谢您啦 Struts标签checkbox标签为什么不显示哦? 请教eclipse 怎么安装j2ee插件 用java怎样实现消息及时提醒?
——一般情况下,是不能释放的,释放了就没法next()了。是直接对数据库进行操作吗?
——有预读的能力,但可以理解为直接对数据库操作。还是像.NET的DataSet一样先将查询的结果集存放在本地,然后再对其进行操作?
——不是这种。但也有可以支持这种的,要用CachedRowSet,可以把数据先全部下载完毕。
是不是一般在做程序的时候都用CachedRowSet,如果用ResultSet的话,占用数据库连接,对数据库并发性要求高的情况下是不可取的。2L的前辈说将ResultSet转换为VO对象,我不太明白是什么意思,纯新手,请不吝赐教。
“如果用ResultSet的话,占用数据库连接,对数据库并发性要求高的情况下是不可取的”
—— 我觉得你理解存在误区,使用ResultSet的过程是必然存在的,只要程序能最大可能缩短这个过程即可;前面所说的封装为VO,实际上也是循环读取ResultSet,然后转成VO的过程;虽然能稍微减少数据库连接占用时间,从总体开销上来说,消耗了更多的CPU时间;
—— 你所说的.Net,它直接把结果集放入内存,必然也存在着循环遍历ResultSet将数据库所返回数据全部读取出来然后再放入内存的过程,只不过这个过程被封装好了,你不知道;
—— 最后,某些情况下,占用数据库连接能有效降低内存开销,比如你开发一个程序,负责将数据库中的 壹佰万上记录导出成文件;这种情况下先把ResultSet内容放到内存中的做法显然是不可取的。
数据库连接是不能释放的,如果释放了,你就没法操作数据库了。是直接对数据库进行操作吗?
我个人认为是直接操作数据库的。
public class Student {
private String name;
private Date brithday;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
...
}
.net 的 DataSet个人理解是前者,参考http://developer.51cto.com/art/200910/159546.htm。