请问,获得resultSet对象后,通过rs.next()是从缓存取还是通过db取?
也就是说resultset是一次性从db返回,还是一行行下移(100条数据需要访问100次db)?另外,fetchSize()和setMaxRows()又对rs有什么帮助,谢谢大家

解决方案 »

  1.   

    rs.next()是从缓存取,这时候已经和DB断开联系了
      

  2.   

    那fetchSize()和setMaxRows()又对rs有什么帮助?
      

  3.   

    哦 受教了
    3楼说的我还真不知道啊
    一般我处理rs的时候都是closeDB以后的事情
      

  4.   

    个人认为是有连接的,rs。next()操作的数据库中的游标fetchSize()方法没找到
    到是有个setfetchSize() 和 getfetchSize()
    setFetchSize
    void setFetchSize(int rows)
                      throws SQLException为 JDBC 驱动程序提供关于需要更多行时应该从数据库获取的行数的提示。指定的行数仅影响使用此语句创建的结果集合。如果指定的值为 0,则忽略该提示。默认值为零。 int getFetchSize()
                     throws SQLException检索结果集合的行数,该数是根据此 Statement 对象生成的 ResultSet 对象的默认获取大小。如果此 Statement 对象没有通过调用方法 setFetchSize 设置获取大小,则返回值是特定于实现的。 返回:
    根据此 Statement 对象生成的结果集合的默认获取大小 
      

  5.   

    这个得看是客户端游标还是服务器游标。默认的都是服务器游标,每次next会到服务器进行一次结果集操作。目前大部分都进行了预读取,进行部分数据的客户端缓冲。delphi里面这个更明显。
      

  6.   

    默认的都是服务器游标,每次next会到服务器进行一次结果集操作。???
    不是这样吧,否则的话,数据库的压力也太大了。
      

  7.   

    如果断开连接了,ResultSet里面肯定就取不到数据
      

  8.   

    我的理解是fetchSize是每次与数据库交互取得的结果个数, maxRows就是最大的结果数。
    而比如你的查询条件下, 数据库里有1000条记录符合搜索结果, 而maxRows为550条, fetchSize为100, 那么实际上是通过了6次查询的归并才取得了你最终的结果。 每次查询都把结果缓存了, 而你取next时, 如果在当时的100条内的话,就是在缓存里取, 如果是100条之外, 那么则查下一个100条之后放到缓存里给你。 只不过你作为客户端编程, 这些所有的过程对于你都是透明的, 你只需要用next方法就行了。 
    这是我的理解, 不对的地方请指正。
      

  9.   

    通常情况下, fetchSize的配置是有讲究的, 这个看数据量的大小而定, 不是数值越大越好。 具体你得自己查查怎么优化,这方面我理解不深刻。
      

  10.   


    个人理解是:查询结果分页要用的!
    fetchSize()为每页要显示的结果数(行数),setMaxRows()为最大结果集行数!两个数值就可以确定页数!
    不知是不是这样!
      

  11.   

    是全部取到然后放到缓存当中通过next再一个一个的读出来
      

  12.   

    断开了,则ResultSet自动close,你是无法操作的
      

  13.   

    我觉得ResultSet是一次性先把数据取到缓存中,不可能是取一次就访问一次数据库,这样效率性能方面太太太差了,java没有这么蠢
      

  14.   

    肯定是都一次性放到结果集里了!但是这是也不能close db, 否则取不到
      

  15.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主截止到2008-06-19 17:28:20的汇总数据:
    注册日期:2007-5-14
    上次登录:2008-6-15
    发帖数:1
    结贴数:0
    结贴率: 0.00%
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  16.   

    我觉得这个可以慢慢来分析,对数据库的游标来操作可能有这么些情况:
    1、一次从数据库读取到内存中,然后断开连接。每次读取都从内存中读取。如果我是驱动设计者肯定不会这么设计,很显然这样的读取不能够支持大数据量,如果数据有几百万条,一次性读取到内存中,不要说每次读取的数度会很慢,而且内存也放不下。当然这种做法在取数据的时候会比较快,但是太不实用了。显然不能这么设计。
    2、每次next的时候都去数据库取数据,去玩后断开连接,等到下一次next再打开链接取。这种做法明显也不行,每次next操作都要打开关闭数据库,如果有大量的读取数据库操作,那样完了,cpu处理不过来。
    3、读取数据时跟数据库建立一个固定链接,每次next读取数据,但是不关闭数据库连接,等到数据全部去玩再关闭连接,这种方式显然比上面两种要好。但是仍然存在瓶颈,每次去数据库读取,就要在数据库中多做操作同样影响速度。
    4、大致与上一个一样,只是在第一次next的时候同时向后读取若干数据到内存中,以后每次next到内存中取,不去数据库中去,直到内存中取完再去数据库中取若干数据,这样又更好了,提高了操作速度也节约内存资源。
    5、在next的时候并不读取任何数据,只是做一个标记,然后等next完成,一次性把标记项传给数据库操作对象,一次性读取出来然后关闭。
      

  17.   

    你们觉得可能一次性取出来吗?
    100W数据,ResultSet你读读试试看,能不能取出来?
    按大家说,估计直接Out of Memory.大家不要开玩笑。
      

  18.   


    fetchSize 可以将库中的数据先捞回本地jvm中进行处理,设定的值过大或过小都不是很好
    过大,一下子拉出的数据比较多,影响用户体验
    过小,查询数据是较快,但需频繁与数据库交互
    如果要做分页之类的查询,一般可以取2到3页 页面数据的总数
      

  19.   

    ResultSet 是结果集 ,在数据库中查出来以后就存储在ResultSet中,ResultSet对象是在内存中的,所以
    是在内存中也就是缓存中读取数据。