ssh session

J2EE 码拜 6年前 (2015-04-08) 408次浏览 0个评论

关于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貌似也不需要手动关闭吧?那么第三种相对于第二种有什么存在的意义呢?望指教。

ssh session
40分
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实例的正确打开和关闭.
ssh session
引用 1 楼 EverWHL 的回复:

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实例的正确打开和关闭.

多谢了,看来我有地方理解错了。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明ssh session
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!