关闭二级缓存和开启查询缓存,此时是有两个session,因此无一级缓存:
<一>①当查询实体对象的时候,第一次调用list()查询实体对象的时候,会将查询到的实体对象id放在查询缓存中(一二级缓存如果有,也会缓存实体对象的),第二次调用list()查询实体对象的时候会根据查询缓存中的id来查询对象,然后去一级,二级缓存中查找,由于关闭了二级缓存,同时session缓存也无,因此会向数据库发N条sql语句。
② 当查询实体对象的时候,第一次调用iterate()查询实体对象的时候,会将查询到的实体对象存到缓存中,第二次调用iterate()的时候,还是会发出一条select id from 表 找出id然后根据id去一二级缓存中查找是否有实体对象。如果没找到,就向数据库发n条语句。
反思:为什么list()第二次不会发送select id from 表,list()又怎么知道所查询的结果id在查询缓存中?我们知道list()只会利用查询缓存,不会利用一二级缓存的!!!
总结:
①当查询实体对象的时候,list会利用查询缓存来缓存id,然后根据缓存中的id,去一二级缓存中找,如果一二级缓存中没有,就会出现n条语句问题!!!而iterate()不会利用查询缓存的!!!就算是查询属性的时候也是不会利用查询缓存的!!!因此 查询缓存只对List有效!!!
②List不会利用一二级缓存的!!!但是有一种情况貌似可以,但是不全是,当开启查询缓存的时候,查询实体对象的时候,会缓存id,然后会根据该id去一二级缓存中查找对象。List()查询属性的时候,可以直接从查询缓存中查询,但是sql语句必须一致,
③一二级缓存是缓存实体对象的。查询缓存是缓存实体id,和普通属性的.