hibernateTemplate session關閉

langgufu314發表於2012-04-18

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()

相關文章