hibernate session的问题
发布网友
发布时间:2022-04-11 23:47
我来回答
共3个回答
热心网友
时间:2022-04-12 01:16
这个么,你这个是hibernate与spring整合开发,让DAO继承了spring的HibernateDaoSupport,这样的确能够提高开发效率 ,但是不够灵活,而且使DAO层依赖于spring的api,增加了耦合。但是不考虑复用的话还可以。
下面一个一个的分析:
this.getsession实际上是调用了父类中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session.这样做有可能有问题,就是超session池连接数的时候,spring无法自动的关闭session。 不推荐使用
this.getHibernateTemplate().getSessionFactory().getCurrentSession()从spring管理的sessionFactory中创建一个绑定线程的session.spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法
this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session.这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。
楼主 你就不能自己动手做一下试验啊。算了 哥给你代劳吧。
这里我们讨论者三个session的关闭问题。
本来发截图了 但是百度审核啊审核 郁闷
这个是测试的层 log是在servi层构造好的然后传入,都学到spring了也没必要把所有代码都贴出来才能看懂吧
package com.test.spring.;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.test.spring.model.Log;
public class LogDaoMysqlImpl extends HibernateDaoSupport implements LogDao {
public void addLog(Log log) {
//this.getSession().save(log);
//getHibernateTemplate().save(log);
this.getHibernateTemplate().getSessionFactory().openSession().save(log);
}
}
执行结果如下,log4j产生的日志被忽略
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addUser)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addUser)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addLog)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addLog)
check security
Hibernate: insert into log (type, time) values (?, ?)
Sat Jan 12 00:10:00 CST 2002
没有进行session的关闭(不用spring也不用关闭session,session的关闭交给SessionFactory自动处理,但是使用spring的this.getSession没有使用spring创建SessionFactory而是直接从spring的session缓冲池拿到session,spring的session缓冲池中一般默认生成10session,前面也说了,可能是其他线程使用完没有关闭的,所以要显示的调用close,释放资源,因为取出来就放不回去了。所以要手动关闭,而且他两种获取的方法使用了spring提供的SessionFactory,spring会自动的处理没有必要进行手动关闭),就连事物的开启与关闭也不用。
这就是使用spring的好处,把切面上零散的代买同意进行处理。
楼主以后再有什么不明白的,大可以自己动手试试,不然容易把我们的错误观点变成你的。试个八百十次 自己就什么都明白了,而且比别人说的印象更加深刻。
热心网友
时间:2022-04-12 02:34
1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或者一个新的事务获得一个hibernate session,需要程序维护session(手动关闭session)
2.this.getHibernateTemplate().getSessionFactory().getCurrentSession()//openSession()则从spring中获取session
getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。 采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭
3.通过new HibernateCallback(){XXX}获得的session是当前线程中的session
参考资料:还有其他问题的话,给我发百度消息
热心网友
时间:2022-04-12 04:09
this.getsession是获得一个session对象,
this.getHibernateTemplate().getSessionFactory().getCurrentSession()是通过session工厂获得一个session对象
this.getHibernateTemplate().getSessionFactory().OpenSession这个就是通过session工厂开启一个session对象