请问,获得resultSet对象后,通过rs.next()是从缓存取还是通过db取?
也就是说resultset是一次性从db返回,还是一行行下移(100条数据需要访问100次db)?另外,fetchSize()和setMaxRows()又对rs有什么帮助,谢谢大家
也就是说resultset是一次性从db返回,还是一行行下移(100条数据需要访问100次db)?另外,fetchSize()和setMaxRows()又对rs有什么帮助,谢谢大家
3楼说的我还真不知道啊
一般我处理rs的时候都是closeDB以后的事情
到是有个setfetchSize() 和 getfetchSize()
setFetchSize
void setFetchSize(int rows)
throws SQLException为 JDBC 驱动程序提供关于需要更多行时应该从数据库获取的行数的提示。指定的行数仅影响使用此语句创建的结果集合。如果指定的值为 0,则忽略该提示。默认值为零。 int getFetchSize()
throws SQLException检索结果集合的行数,该数是根据此 Statement 对象生成的 ResultSet 对象的默认获取大小。如果此 Statement 对象没有通过调用方法 setFetchSize 设置获取大小,则返回值是特定于实现的。 返回:
根据此 Statement 对象生成的结果集合的默认获取大小
不是这样吧,否则的话,数据库的压力也太大了。
而比如你的查询条件下, 数据库里有1000条记录符合搜索结果, 而maxRows为550条, fetchSize为100, 那么实际上是通过了6次查询的归并才取得了你最终的结果。 每次查询都把结果缓存了, 而你取next时, 如果在当时的100条内的话,就是在缓存里取, 如果是100条之外, 那么则查下一个100条之后放到缓存里给你。 只不过你作为客户端编程, 这些所有的过程对于你都是透明的, 你只需要用next方法就行了。
这是我的理解, 不对的地方请指正。
个人理解是:查询结果分页要用的!
fetchSize()为每页要显示的结果数(行数),setMaxRows()为最大结果集行数!两个数值就可以确定页数!
不知是不是这样!
楼主截止到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
1、一次从数据库读取到内存中,然后断开连接。每次读取都从内存中读取。如果我是驱动设计者肯定不会这么设计,很显然这样的读取不能够支持大数据量,如果数据有几百万条,一次性读取到内存中,不要说每次读取的数度会很慢,而且内存也放不下。当然这种做法在取数据的时候会比较快,但是太不实用了。显然不能这么设计。
2、每次next的时候都去数据库取数据,去玩后断开连接,等到下一次next再打开链接取。这种做法明显也不行,每次next操作都要打开关闭数据库,如果有大量的读取数据库操作,那样完了,cpu处理不过来。
3、读取数据时跟数据库建立一个固定链接,每次next读取数据,但是不关闭数据库连接,等到数据全部去玩再关闭连接,这种方式显然比上面两种要好。但是仍然存在瓶颈,每次去数据库读取,就要在数据库中多做操作同样影响速度。
4、大致与上一个一样,只是在第一次next的时候同时向后读取若干数据到内存中,以后每次next到内存中取,不去数据库中去,直到内存中取完再去数据库中取若干数据,这样又更好了,提高了操作速度也节约内存资源。
5、在next的时候并不读取任何数据,只是做一个标记,然后等next完成,一次性把标记项传给数据库操作对象,一次性读取出来然后关闭。
100W数据,ResultSet你读读试试看,能不能取出来?
按大家说,估计直接Out of Memory.大家不要开玩笑。
fetchSize 可以将库中的数据先捞回本地jvm中进行处理,设定的值过大或过小都不是很好
过大,一下子拉出的数据比较多,影响用户体验
过小,查询数据是较快,但需频繁与数据库交互
如果要做分页之类的查询,一般可以取2到3页 页面数据的总数
是在内存中也就是缓存中读取数据。