话说适当设置:hibernate.jdbc.fetch_size的值,可以提高性能,每一次从数据库获取一部分的数据放入内存当中.
设置fetch_size的值,是不是每隔N条就会查询一次数据库的???
我设置这个值之后,在查询10万条数据下,查询的时间相隔不大,值为 50 100
fetch_size ms
100 11375
50 12484
25 15609
大家对这个Hibernate处理大数据量的时候,有什么方法呢?
list() 与 iterator() 返回的结果集,哪个会更好?
还有就是fetch_siez 与返回结果集有什么关联吗?
问题补充
这里其实有个疑问,fetch_size与list()会有什么样的关系呢?
List()的结果集是全部数据,那么fetch_size的意义存在于哪里?
还是这里其实有2个步骤,一个查询内存,一个结果集内存?
问题补充
fetch_size 批量读取数, 由于jdbc提供
假设 你有100 条数据, 设置 fetch_size = 5
执行 rs = select * from table
实际上 rs 里面只有5条记录 ,假设编号 1~5, 注意,支取5条数据, 但和db的连接没有断开
1 rs.next() 从缓存里面去数据
2 rs.next() 从缓存里面去数据
3 rs.next() 从缓存里面去数据
4 rs.next() 从缓存里面去数据
5 rs.next() 从缓存里面去数据
缓存里面没有数据了, 通过db连接, 在取fetch_size 对应的条数5条, 编号 6~10
6 rs.next() 第六条
...
明白了吧
-------------------------
fetch_size 的用就是避免一次取过多的数据,导致内存不足。
fetch_size为了避免查询的时候内存不足,那么它获取后的数据集List resultList = query.list();
这个resultList集合是fetch_size的值还是已经获取全部的值?
高手出来说说!!!
问题补充
fetch_size为了避免查询的时候内存不足,那么它获取后的数据集List resultList = query.list();
这个resultList集合是fetch_size的值还是已经获取全部的值?
高手出来说说!!!
List 只是个接口而已, 是不是返回所有集合,完全由List的实现来决定。
HIbernate里的集合类是被从新实现过的,当然考虑到了批次加载,缓存,懒加载等等诸多方面的问题。
确实List只是个接口,但是你有查看过源代码没有,我找不到其实现List这个接口的类,到HQLQueryPlan这个类的performList方法,List接口的实现类是ArrayList,并没有看到你说的 0, 0.。。
问题补充
看来是我表达有问题了...........
囧
问题补充
说说你的理解吧。
问题补充
最近自己写代码进行验证:
发现无论自己怎么在query,setFetchSize的值,查询的效率都维持不变,并没有什么效率提高的问题,不知道是这种模式下面实现的方法有问题,还是机器的性能问题,知道的朋友说说吧。
query.list()确实返回全部数据,这点全世界都知道,在这之后,我曾经以为地超过fetchsize这个值之后,会有一些hql查询数据库,但是我错了,结果是没有的。
但是query,iterator()就是一条一条地查询,正如人家总结那样。
设置fetch_size的值,是不是每隔N条就会查询一次数据库的???
我设置这个值之后,在查询10万条数据下,查询的时间相隔不大,值为 50 100
fetch_size ms
100 11375
50 12484
25 15609
大家对这个Hibernate处理大数据量的时候,有什么方法呢?
list() 与 iterator() 返回的结果集,哪个会更好?
还有就是fetch_siez 与返回结果集有什么关联吗?
问题补充
danny05881 写道
fetch size 是读取数据时每次去数据库中读取的记录数,当遍历完这些记录后,再去数据库里面取fetch size 个记录数来遍历,以此类推
list()因为一次会获取所有的结果集对象,并且初始化所有的对象,所以在大数据量的情况下内存消耗会比较的大
list()因为一次会获取所有的结果集对象,并且初始化所有的对象,所以在大数据量的情况下内存消耗会比较的大
这里其实有个疑问,fetch_size与list()会有什么样的关系呢?
List()的结果集是全部数据,那么fetch_size的意义存在于哪里?
还是这里其实有2个步骤,一个查询内存,一个结果集内存?
问题补充
mikewang 写道
piaoxue_x 写道
感觉解释的都不是很好。。。。。期待牛人解释一下。。。。。
fetch_size 批量读取数, 由于jdbc提供
假设 你有100 条数据, 设置 fetch_size = 5
执行 rs = select * from table
实际上 rs 里面只有5条记录 ,假设编号 1~5, 注意,支取5条数据, 但和db的连接没有断开
1 rs.next() 从缓存里面去数据
2 rs.next() 从缓存里面去数据
3 rs.next() 从缓存里面去数据
4 rs.next() 从缓存里面去数据
5 rs.next() 从缓存里面去数据
缓存里面没有数据了, 通过db连接, 在取fetch_size 对应的条数5条, 编号 6~10
6 rs.next() 第六条
...
明白了吧
-------------------------
fetch_size 的用就是避免一次取过多的数据,导致内存不足。
fetch_size为了避免查询的时候内存不足,那么它获取后的数据集List resultList = query.list();
这个resultList集合是fetch_size的值还是已经获取全部的值?
高手出来说说!!!
问题补充
mikewang 写道
maglic 写道
fetch_size为了避免查询的时候内存不足,那么它获取后的数据集List resultList = query.list();
这个resultList集合是fetch_size的值还是已经获取全部的值?
高手出来说说!!!
List 只是个接口而已, 是不是返回所有集合,完全由List的实现来决定。
HIbernate里的集合类是被从新实现过的,当然考虑到了批次加载,缓存,懒加载等等诸多方面的问题。
确实List只是个接口,但是你有查看过源代码没有,我找不到其实现List这个接口的类,到HQLQueryPlan这个类的performList方法,List接口的实现类是ArrayList,并没有看到你说的 0, 0.。。
问题补充
hhcysn 写道
最然我不知道楼主在说什么 但看起来很复杂的样子
看来是我表达有问题了...........
囧
问题补充
elvishehai 写道
之前搞过.现在好像也不忘记了,
说说你的理解吧。
问题补充
最近自己写代码进行验证:
- public static void main(String[] args)
- {
- final Session session = HibernateSessionFactory.getSession();
- final String hql = "from Remark as remark";
- final Query query = session.createQuery(hql);
- query.setFetchSize(100);//fetch
- final Long startTime = System.currentTimeMillis();
- List<Remark> remarks = query.list();
- final Long endTime = System.currentTimeMillis();
- System.out.println((endTime - startTime));
- int i = 0;
- for(Remark remark : remarks)
- {
- i++;
- remark.getName();
- if(i>100)
- {
- System.out.println("跳出");
- break;
- }
- }
- }
发现无论自己怎么在query,setFetchSize的值,查询的效率都维持不变,并没有什么效率提高的问题,不知道是这种模式下面实现的方法有问题,还是机器的性能问题,知道的朋友说说吧。
query.list()确实返回全部数据,这点全世界都知道,在这之后,我曾经以为地超过fetchsize这个值之后,会有一些hql查询数据库,但是我错了,结果是没有的。
但是query,iterator()就是一条一条地查询,正如人家总结那样。