当前位置: 代码迷 >> Java Web开发 >> SSH 中hibernate一级缓存有关问题()
  详细解决方案

SSH 中hibernate一级缓存有关问题()

热度:4210   发布时间:2013-02-25 21:11:51.0
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,最后提交。
  相关解决方案