0075 Hibernate:Query.iterator()的N+1问题【基础】
来源:互联网 发布:人人网外推软件 编辑:程序博客网 时间:2024/06/06 08:47
原文出自:http://hi.baidu.com/prometheus2008/item/c66fbbe88def46c7baf37d61
或者Iterator方式来第一次读取数据的时候,JCS是空的,此时不管是List方式还是Iterator方式都会往JCS里面填充查询出来的持久对象,例如:
select c from Cat as c而
select c.id, c.name from Cat as c
这种HQL语句不构造PO,因此不会去填充JCS。
好了,现在JCS里面填好了数据,但是该怎么取呢?上面我说过是按照对象的唯一标示来存取的,而对于PO持久对象来说,唯一标示就是主键,因此Hibernate首先必须获得主键列表,然后根据主键列表挨个判定,看这个持久对象究竟是在JCS里面还是在数据库里面,假如在JCS里面,那么按照主键取,假如在数据库,那么发送sql取。
现在我们来分析为什么Iterator可以使用JCS,而List不能。上面说了,用JCS之前,要先获得持久对象的主键,才能去JCS里面取持久对象,而我们怎么才能获得主键列表呢?必须去数据库中取得,这一步是没有办法缓冲的。
Hibernate Iterator的查询本身是分为两步的:
==> select id from cat
==> select * from cat where id = ?
==> select * from cat where id = ?
...
==> select * from cat where id = ?
第一步,去数据库中取主键列表,第二步,按照主键一个一个取数据。当然了,我们现在可以看出来,Iterator方式下假如不用JCS的话,那么从数据库中取
出n条记录就需要n+1次sql查询,这是非常可怕的事情,因此假如在没有使用JCS的情况下,你又必须一次去取大量数据,应该避免使用Iterator。
而Iterator的第一次sql是取主键列表,这个时间消耗是非常少的,假如使用了JCS,那么每次查询仍然要不可避免的去发送一次sql: select id from cat 去取主键列表,然后呢? 然后Iterator就不会那么傻了,他会先到JCS里面去看看,按照主键去找持久对象,假如有了,直接拿出来用,假如没有,那么只好去数据库中取得,然后再把它填到JCS里面去。
因此可以看出来,JCS有点类似一个内存中的简单对象数据库, Iterator的第一次sql取主键列表是必须要到数据库里面取的,取得了主键这把钥匙以后,Iterator会首先尝试开JCS这把锁,打得开就直接进去,假如打不开,就只好去开数据库这把锁了。
而Hibernate List方式是JDBC的简单封装,一次sql就把所有的数据都取出来了,它不会像Iterator那样先取主键,然后再取数据,因此List无法利用JCS。不过List也可以把从数据库中取出的数据填充到JCS里面去。
最佳的方式:第一次访问使用List,快速填充JCS,以后访问采用Iterator,充分利用JCS。
mikeho write:
那JCS是如何和Database保持同步的?
robbin write:
jcs.default.elementattributes.MaxLifeSeconds=240(最大缓冲时间)
超时做作废,另外你在程序里面也可以clear JCS cache
0 0
- 0075 Hibernate:Query.iterator()的N+1问题【基础】
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate中的query.list()与query.iterator()方法的区别
- Hibernate中Query.list()和Query.iterator()的区别
- Hibernate Iterator的问题
- hibernate-Query的list方法与iterator方法的区别
- Hibernate的1+N问题(N+1)
- Hibernate 中Query的list方法和iterator方法
- Hibernate Query查询的list方法和iterator方法区别
- Hibernate的N+1问题
- Hibernate的n+1问题
- hibernate 的N + 1问题
- Hibernate Query的小问题
- Hibernate n+1问题
- Windows Phone 7 如何获取用户和手机的信息
- MFC学习注意
- wamp不能使用phpmyadmin,提示“You don't have permission to access /phpmyadmin/ on this server.”
- C语言作业——反复校验用户输入的生日,包括年、月、日。直到年、月、日都合法。
- 应用程序基础及组件
- 0075 Hibernate:Query.iterator()的N+1问题【基础】
- ubuntu apt-get 相关参数
- 导入DBF文件方法
- Wireshark学习与开发资料
- 产品需求文档(PRD)的写作方法
- 黑马程序员-javaIO总结 续——其他常用与IO流有关的对象
- Linuxubuntu chmod和chown命令用法详细介绍
- tokuDB存储引擎的安装、配置、使用及注意事项
- 润乾Flash打印Jar包说明及与Applet打印的对比