hibernate缓存思考

关闭二级缓存和开启查询缓存,此时是有两个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,和普通属性的.

你可能感兴趣的:(Hibernate,查询缓存,hibernate缓存机制思考,一二级缓存)