hibernate.jdbc.fetch_size的迷惑10

话说适当设置:hibernate.jdbc.fetch_size的值,可以提高性能,每一次从数据库获取一部分的数据放入内存当中.

设置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()因为一次会获取所有的结果集对象,并且初始化所有的对象,所以在大数据量的情况下内存消耗会比较的大



这里其实有个疑问,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 写道
之前搞过.现在好像也不忘记了,

说说你的理解吧。
问题补充
最近自己写代码进行验证:
Java代码   收藏代码
  1. public static void main(String[] args)  
  2. {  
  3.   final Session session = HibernateSessionFactory.getSession();  
  4.   final String hql = "from Remark as remark";  
  5.   final Query query = session.createQuery(hql);  
  6.   query.setFetchSize(100);//fetch  
  7.   final Long startTime = System.currentTimeMillis();  
  8.   List<Remark> remarks = query.list();  
  9.   final Long endTime = System.currentTimeMillis();  
  10.   System.out.println((endTime - startTime));  
  11.   int i = 0;  
  12.   for(Remark remark : remarks)  
  13.   {  
  14.     i++;  
  15.     remark.getName();  
  16.     if(i>100)  
  17.     {  
  18.       System.out.println("跳出");  
  19.      break;   
  20.     }  
  21.   }  
  22. }  

发现无论自己怎么在query,setFetchSize的值,查询的效率都维持不变,并没有什么效率提高的问题,不知道是这种模式下面实现的方法有问题,还是机器的性能问题,知道的朋友说说吧。

query.list()确实返回全部数据,这点全世界都知道,在这之后,我曾经以为地超过fetchsize这个值之后,会有一些hql查询数据库,但是我错了,结果是没有的。
但是query,iterator()就是一条一条地查询,正如人家总结那样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值