日期:2014-05-17  浏览次数:20630 次

SSH 中hibernate一级缓存问题(求助)
SSH中dao层主要负责数据库的增删改查;业务层是dao组件的门面,通过组合多个dao来实现业务所需功能;
Hibernate用到spring的模版HibernateTemplate,session被spring代理,spring负责session的关闭,如:
  public void save(Student transientInstance) {
log.debug("saving Student instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
操作完毕后spring会自动关闭session,这样的话session生命周期也太短了吧,一级缓存不就没了吗?

  public Student findById(java.lang.String id) {
log.debug("getting Student instance with id: " + id);
try {
Student instance = (Student) getHibernateTemplate().get(
"com.student.javabean.Student", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}

   

如果在业务层有如下操作:
  Student s = sdao.findById(sid);
Set<Course> courses = s.getCourses();

  会报错no session or session was closed
  因为采用了延迟加载,所有会报这个错。说明session确实已经在dao层关闭了。
  
如果用opensessionviewfilter(可延长session的生命周期,从dao-->service-->Acion-->jsp(view) 然后才关闭session)即便是这样,session的一级缓存作用貌似也不大?
求解?
或者给给一级缓存实际用处的例子

------解决方案--------------------
一级缓存是Session级别的缓存,它是属于事务范围的缓存。

当应用程序调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。

总的来说:一级缓存发挥作用主要是面向长事务的操作,减少跟数据库频繁交互的次数,比如:Select 然后不断的 Update,最后提交。