使用getSession()方法,使用完之后必須自己調用相應的 close方法!


java新手級問題:

今天使用hibernate的:

Session session = this.getSession(); 
Query query = session.createQuery("update Links set index = index"+indexStr+" where id <> "+id); return query.executeUpdate();

頁面快速重復的多次提交數據庫的操作后程序直接卡死無響應了,,,   很費解(我當時想是不是沒有關閉連接之類的.但是為什么執行多次才卡死呢?)

使用另一種方法后問題解決:

return this.getHibernateTemplate().bulkUpdate("update Links set index = index"+indexStr+" where id <> "+id)

 

百度搜索“getHibernateTemplate()和getSession()的區別” 后才發現 使用getSession()方法,使用完之后必須自己調用相應的 close方法!

如果要用getSession()方式必須使用后關閉session:

Session session = this.getSession(); 
        Query query = session.createQuery("update Links set index = index"+indexStr+" where id <> "+id);
        int result= query.executeUpdate();
        session.close(); return result;

 

附上《getHibernateTemplate()和getSession()的區別》 

轉自:http://jeoff.blog.51cto.com/186264/133434/

自動生成hibernate配置文件的時候,會在dao層用到getSession()方法來操作數據庫記錄,但是他還有個方法getHibernateTemplate(),這兩個方法究竟有什么區別呢?

 

  • 1.使用getSession()方法你只要繼承sessionFactory,而使用getHibernateTemplate()方法必須繼承 HibernateDaoSupport當然包括sessionFactory,這點區別都不是特別重要的,下面這些區別就很重要了

 

  • 2.getSession()方法是沒有經過spring包裝的,spring會把最原始的session給你,在使用完之后必須自己調用相應的 close方法,而且也不會對聲明式事務進行相應的管理,一旦沒有及時關閉連接,就會導致數據庫連接池的連接數溢出,getHibernateTemplate()方法是經過spring封裝的,例如添加相應的聲明式事務管理,由spring管理相應的連接。
在實際的使用過程中發現的確getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()並沒有提供,這時我們用HibernateCallback 回調的方法管理數據庫.
例如如下代碼:
 
/**
     * 使用 hql 語句進行操作
     * @param hql HSQL 查詢語句(使用回調函數訪問外部變量,必須是final的)
     * @param offset 開始取數據的下標
    * @param length 讀取數據記錄數
    * @return List 結果集
*/
public List getListForPage ( final String hql , final int offset , final int length ) {
              List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
                            public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                                            Query query = session.createQuery ( hql ) ;
                                            query.setFirstResult ( offset ) ;
                                            query.setMaxResults ( length ) ;
                                            List list = query.list ( ) ;
                                            return list ;
                           }
               }) ;
               return list ;
}

 

 

 

附上《getSession 和 getHibernateTemplate用哪個?》 

轉自:http://blog.csdn.net/zdwzzu2006/article/details/6071806

文中介紹到“其實getSession()是會自動釋放連接的。但是在一個線程內getSession會get很多個session(就是開很多個會話、連接),很可能導致數據庫連接超過上限。所以推薦使用getHibernateTemplate。”

通過繼承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。這樣也可以,就是麻煩點。

 

另外:getSession() 獲得的是原始的sessionFactory,每次你必須自己維護session如結束后你必須關閉session。如果是hibernate中進行數據庫操作,你獲得是原始的hibernate style和excepttion。

而hibernate template是spring包裝過的,它會幫你管理session,並且它會將hibernate exceptions轉換成其他的分類后的錯誤。這點getSession是肯定不行了。例如你用orcle和mysql返回的錯誤在getSession中就是不一樣的,而在hibernate template中就是一樣的。 

但我在實際使用中發現,對於基本的操作Hibernate template處理的的確比getSession要好,但到了復雜查詢的時候如分頁時需要調用getHibernateTemplate().execute(HibernateCallBack).要產生很多innerClass,調試非常不便。而getSession就相當簡單多了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM