关于ssh session管理
我在网上看到很多种方法
第一种:就是我以前用过的最基本的
@Autowired
private SessionFactory sessionFactory;
Session session = sessionFactory.getCurrentSession();
第二种就是使用spring的HibernateTemplate进行管理
Session se =this.getSession();//获取Session对象
String hql = "from Ssh where id=" + id;
List<Ssh> list = this.getHibernateTemplate().find(hql);
这种需要继承HibernateDaoSupport
还有一种 应该是属于第二种的一种分支吧?
//网上找的代码
public long getMaxMailId() {
long maxId = 0l;
maxId = ((Long) (this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(org.hibernate.Session session)
throws HibernateException, SQLException {
String sql = "select max(id) from Mail";
Query query = session.createQuery(sql);
return query.list();
}
}).get(0))).longValue();
return maxId;
}
我想问一下 这3种方式的具体区别(目前知道的 貌似就是 第一种需要自己手动开闭?其他2种不需要)
主要是后两种的区别,因为感觉第二种完全可以取代第三种,毕竟代码量少这么多,而且session貌似也不需要手动关闭吧?那么第三种相对于第二种有什么存在的意义呢?望指教。
------解决思路----------------------
1.先说第一种吧
getCurrentSession创建的session会和绑定到当前线程
getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭
2.再说第二种和第三种区别简单的总结下
HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭.
HibernateTemplate 除能参与到 Spring管理的事务中,还能够确保Session实例的正确打开和关闭.
具体点
如果DAO直接使用HibernateDaoSupport的getSession()方法获取session进行数据操作而没有显式地关闭该session,那么程序表现为:每个session会打开一个connection,并且 connection会一直保持(因为没有显式地close).如果程序使用了c3p0连接池,则因为c3p0连接池默认最大连接数是15,程序会表现为 当打开第15个连接时,程序处于停滞状态,等待从连接池获取新的连接.
在同样条件下,使用HibernateTemplate进行数据操作,就没有连接数持续增长的情况,程序结束时连接数归零.这印证了spring文档 上所说:HibernateTemplate会对session进行了管理,能够确保Session实例的正确打开和关闭.