Hibernate Session缓存

当Session的save()方法持久化一个对象时,这个对象就被加入到Session的缓存中。当Session的查询方法试图从缓存中加载这个对象时,Session先判断缓存中是否存在这个对象,如果存在,就不再去数据库中检索。

Session缓存的2大作用:
1)提高性能。由于从缓存中查询而不再去数据库中查询,所以提升了性能,减少了数据库访问。
2)合并SQL。
例如:
Clazz  clazz = session.load(Clazz.class,5);
clazz.setName("frank1");
clazz.setName("frank1234");
session.save(clazz); //和调用session.update(clazz)或者注释掉效果一样。
tx.commit();

最后只会执行一个SQL:update clazz set name='frank1234' where id=5;

session只有在清理缓存( 根据缓存中的数据同步更新数据库)的时候才向数据库提交要执行的SQL。

session清理缓存的时机:
1)调用commit()的时候,先清理缓存,再提交事务。
2)调用flush()方法时。

flush()和commit()的区别是,flush()仅清理缓存,执行一系列的SQL,但是不提交事务。commit()方法是先执行flush()然后再执行commit();

清理缓存的含义不是将对象从Session中清理出去,而是根据变化了的对象生成SQL,并将SQL语句提交数据库执行。

例如:
Course course10 = (Course)session.get(Course.class,10);
course10.setName("yyy");
session.flush();//后台输出Hibernate: update course set name=? where id=?
Course course = (Course)session.get(Course.class,10);//无从后台数据库查询的SQL,也就是从缓存中获取的。
System.out.println(course);//输出的name值是最新的"yyy",而不是之前数据库中的值。

猜你喜欢

转载自frank1234.iteye.com/blog/2174119
今日推荐