请教大侠们一个问题,谢谢。
如题,最近在看《数据访问模式》,其中讲到“分页迭代器”时,给的说明代码中,是给定ResultSet,再对需要显示的页调用结果集的setFetchSize方法,就可以一条一条取该页的数据了。
这么做当然可以,不过按书上说的使用这种“分页迭代器”的优点之一,是“降低了存储需求”,每次只在内存中保存一页查询结果。看到这,我比较疑惑:
如果所有的结果都查出来了,放在ResultSet,再一页一页取。那么这个存放所有结果的“ResultSet”是否会占用内存?如果占用,那么“降低了存储需求”岂不是一句空话。如果不占用,是否说明“ResultSet”中没有包括实体数据,只是类似“存根”的东西,占很少的内存?
谢谢。

解决方案 »

  1.   

    谢谢ht1258,
    您说的“重新加载”,是指从ResultSet中获取某页所需的 逐条记录,并翻译为DomainObject List吗?另,我比较疑惑的是,ResultSet 究竟占了多少内存? 
    举个例子类说明吧,假设与 ResultSet 对应的表结构为 userID  int
    userName vchar2(20)
    address vchar2(200)
    sexual int对应的 User 类大约为
    class User
    {
        String userName;
        String address;
        int  sexual;
    }则可大致估算一下,假设平均一个user类占用了 4+ 10 + 100 + 4 = 118字节的内存。如果某个一次查询,共查出来10万条纪录。也就是说,通过select语句返回的ResultSet可取出10万条纪录,我的问题是,返回的ResultSet 对象占多少内存?如果大约占用了 10万 * 118 字节的内存,那么就算我一次只将其中的一页(10条纪录)翻译为一个count为10的List,又有什么用。因为ResultSet已经占用了很大的内存了,“降低了存储需求”岂不是一句空话。如果ResultSet实际只占用很少的内存,那是否可以理解为 ResultSet中实际并没有取得每个字段的值,而只包含了每条纪录在数据库中的位置,这样就只占很少的内存了,等调用resultSet.getObject(i)等语句时,才从数据库中将数据读到内存中?