1 hibernate 中的缓存问题
A 一级缓存和session的生命周期一样的,在比如
Student student=(Student)session.load(Student.class,1);
这样的语句中,如果两次发出这样的语句,是可以用到缓存的。
同样,用get也是可以用缓存的。
B 如果是用迭代查询,比如这样:
Student student=(Student)session.createquery("from student s where s.id=1").iterate().next();
之类的话。是能用缓存的。
但如果查询普通属性的话,比如
Student student=(Student)session.createquery("select s.name from student s where s.id=1").iterate().next();
如果两次查询的话,则不能用缓存,是要再发多条sql语句的。
所以一级缓存是缓存实体对象的。
B 以上说的是在一个session中发出的。如果在两个session中的话。它们之间不能用缓存。
C 在同一个session中,先用session.load查询,然后session.clear(),
再用session.load(),则很明显不能用缓存了,肯定要发出sql.可见
session.clear()是可以清除一级缓存的。可以看到,hibernate的一级缓存
是咱们控制不了的。
D 避免一次性大量实体数据入库,先flush,后clear.
2 hibernate 的ecache的设置,见http://www.cnblogs.com/jackyrong/archive/2008/08/29/1279083.html
3 查询缓存:
Query query=session.createQuery(".......");
query.setCacheable(true);
要注意的是,查询级缓存,只对如query,list()起作用,对query.iterate()不起作用
注意查询缓存的时候,在hibernate.cfg.xml中
<property name="hibernate.cache.use_query_cache">true</property>