转一有实践有真相的博文,先理解着先,自己未验证
都说 Spring 和 Hibernate 是绝配,今天有点小小心得,拿出来共享一下
当我们费了九牛二虎之力终于把环境全配好之后,有一个问题摆在面前:如何访问数据库? 通过继承HibernateDaoSupport我们有两个选择:
- getSession().createQuery()
- getHibernateTemplate().find()
用哪个呢?困惑啊。网上找了找资料都是推荐用 getHibernateTemplate,原因说的不是很清楚。于是我做了如下测试
分别循环调用 getSession().createQuery() 和 getHibernateTemplate().find() 1000次,结果 getSession() 很快就报无法建立连接了,而 getHibernateTemplate 屁事没有可以跑完
通过后台观察,使用 getSession 会在数据库中留下很多 SQL*Net message from client 的连接,终止测试后连接自动释放;而getHibernateTemplate则从头到尾都使用一个连接
难道是getSession()不会自动释放连接? 于是我又分别循环调用 getSession().createQuery() 和 getHibernateTemplate().find()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的没有测试