小弟以前是学.NET的,刚学JSP,有些不明白的地方想请教各位前辈利用JDBC访问数据库,使用查询返回ResultSet结果集。使用While(rs.Nest())遍历ResultSet的过程中,数据库连接释放了吗?是直接对数据库进行操作吗?还是像.NET的DataSet一样先将查询的结果集存放在本地,然后再对其进行操作?

解决方案 »

  1.   

    使用While(rs.Nest())遍历ResultSet的过程中,数据库连接释放了吗?
    ——一般情况下,是不能释放的,释放了就没法next()了。是直接对数据库进行操作吗?
    ——有预读的能力,但可以理解为直接对数据库操作。还是像.NET的DataSet一样先将查询的结果集存放在本地,然后再对其进行操作?
    ——不是这种。但也有可以支持这种的,要用CachedRowSet,可以把数据先全部下载完毕。
      

  2.   

    非常肯定的告诉你,没有。在遍历结果集的时候,数据库连接如果断开,ResultSet将无法遍历数据,除非使用特殊的可缓存的结果集,实际java程序员都会用数据库连接池 来提高性能,也会将ResultSet的结果转换为VO对象缓存在另外的地方,这样就可以不依赖数据库连接。
      

  3.   

    谢谢两位高手解答
    是不是一般在做程序的时候都用CachedRowSet,如果用ResultSet的话,占用数据库连接,对数据库并发性要求高的情况下是不可取的。2L的前辈说将ResultSet转换为VO对象,我不太明白是什么意思,纯新手,请不吝赐教。
      

  4.   

    一般做程序的时候,都会用成熟的数据访问组件来处理数据库访问。那么数组访问组件会把查询的结果自动转换为 值对象类(VO),然后作为List返回,比如:List<Student>
    “如果用ResultSet的话,占用数据库连接,对数据库并发性要求高的情况下是不可取的”
    —— 我觉得你理解存在误区,使用ResultSet的过程是必然存在的,只要程序能最大可能缩短这个过程即可;前面所说的封装为VO,实际上也是循环读取ResultSet,然后转成VO的过程;虽然能稍微减少数据库连接占用时间,从总体开销上来说,消耗了更多的CPU时间;
    —— 你所说的.Net,它直接把结果集放入内存,必然也存在着循环遍历ResultSet将数据库所返回数据全部读取出来然后再放入内存的过程,只不过这个过程被封装好了,你不知道;
    —— 最后,某些情况下,占用数据库连接能有效降低内存开销,比如你开发一个程序,负责将数据库中的 壹佰万上记录导出成文件;这种情况下先把ResultSet内容放到内存中的做法显然是不可取的。
      

  5.   

    其实vo也是一个java bean。vo一般用来在不同的层之间传递数据,vo的主要作用是为了解耦,就是尽量减少不同层之间的耦合性。使用While(rs.Next())遍历ResultSet的过程中,数据库连接释放了吗?
    数据库连接是不能释放的,如果释放了,你就没法操作数据库了。是直接对数据库进行操作吗?
    我个人认为是直接操作数据库的。
      

  6.   

    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;
      }
      ...
    }
      

  7.   

    大牛们说得好,小弟认为上面的说法明确一下比较好,因为从数据库返回到本地可以有两种方式:一是一次性返回所有的结果集到本地(TCP拆包是另外的问题),二是每条记录都从数据库返回,是不同的网络请求。
    .net 的 DataSet个人理解是前者,参考http://developer.51cto.com/art/200910/159546.htm。