hibernateTemplate session关闭

1.虽然继承了HibernateDaoSupport这个类,但是this.getSession(),获得的session也要在使用后即使关闭,因为这个session是原生的session不是经过sping代理过的,并且还没有事物管理,自动提交,自动关闭连接等功能,所以使用使用getSession()获得session时一定要关闭。

2.使用getHibernateTemplate()中的1.exceute(callback) 2. executeFind(callback) 3.execute(callback, boolean)时一定要注意:1和2会点方法中使用的session都是经过spring代理过的会自动关闭,但是3最后一个参数标示的是:回调函数中使用的session是否是本地的(没有经过是spring代理过,没有自动关闭连接的功能)。true:本地的 false:spring代理过的(不用但是session是否关闭)

3.spring的bean的默认管理都是单列模式,在ssh整合中保证各dao的的实例是无状态的,佛则在一旦有某个方法设置状态之后,别的方法也就有了状态,但是别的方法又不需要这个状态,或者对别的放产生了别的不好的影响:例如

getHibernateTemplate().setMaxResults(3);

一旦是给HibernateTemplate设置了最大输出记录数,那么以后调用这个类中的别的方法的最大记录数也就是3个,对别人调用这个类的别的方法产生的副作用,除非你再次设置你想要的最大记录数,setMaxResults(10);

4,都说Spring 和 Hibernate是绝配。今天有点小小心得,拿出来共享一下。 当我们费了九牛二虎之力终于把环境全配好之后,有一个问题摆在面前: 如何访问数据库? 通过继承HibernateDaoSupport我们有两个选择: getSession().createQuery("from Users"); getHibernateTemplate().find( "FROM Users); 用哪个呢?困惑啊。 网上找了找资料都是推荐用getHibernateTemplate,原因说的不是很清楚。 于是我做了如下测试: 分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users); 1000次 结果getSession()很快就包无法建立连接了。而getHibernateTemplate屁事没有可以跑完。 通过后台观察,使用getSession会在数据库中留下很多SQL*Net message from client的连接,终止测试后连接自动释放。 而getHibernateTemplate则从头到尾都使用一个连接。 难道是getSession()不会自动释放连接? 于是我又分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users); 5次 发现当前端程序一结束, getSession的5个连接立刻就释放了。结合前面1000次时终止测试后连接自动释放,可以说明getSession()是 会自动释放连接的。 结论: 1、getSession()和getHibernateTemplate都可以自动释放连接(当然你的配置要正确),但是在一个线程内 getSession会get很多个session(就是开很多个会话、连接),很可能导致数据库连接超过上限。所以推荐使用 getHibernateTemplate。 2、如果有些语句无法用getHibernateTemplate实现,可以使用getHibernateTemplate.execute使用 HibernateCallback回调接口。 另:可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参 数传递到super.getSession(..)方法中取得Session。这样也可以,就是麻烦点。 参见: http://springframework.org/docs/api/org/springframework/orm/hibernate3 /HibernateTemplate.html http://www.mxjava.com/blog/article.asp?id=246 请各位高手不吝赐教。 另:用myEclipse自动生成的HibernateDAO代码中。4.1.1版本的myEclipse自动生成的findById方法使用的是 getSession方法获得连接, 不过在6.0中已经修改为使用getHibernateTemplate方法。5.0的没有测试。 getSessionFactory().getCurrentSession()

你可能感兴趣的:(hibernateTemplate session关闭)