关于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种不需要) |
|
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实例的正确打开和关闭. |
多谢了,看来我有地方理解错了。 |