Spring管理session的一些認識和用法心得

來源:互聯網
上載者:User

在項目開發中,使用了SSH框架組成時,多處都會用到Session。在對Session的使用維護上,有如下幾種看法:
1.getCurrentSession(); 
獲得當前會話中的session,該session有容器自我維護管理,Spring可以代理事務。
2.this.getSession();
從當前的執行中獲得或建立一個hibernate的session對象,需要自己手動關閉,以釋放串連資源。
3.openSession();
調用函數自行建立一個資料庫的串連,並將其開啟,在使用Spring操作非查詢語句的請況下,Spring的事務對該session對象不起到交易管理的作用,所以該session對象應當由程式員自己關閉,釋放串連資源。

以上三種操作session的方式,我們都離不開這樣的操作主線:

開啟Session,開始一個事務,處理異常,提交一個事務,最後關閉一個Session。

如果我們自己只專註於業務,不想去作這些重複而繁瑣的操作,那這樣的一套操作對我們來講太繁瑣了!

相信任何一個程式員,都不想重複敲著那一遍又一遍雷同的代碼!

在Spring的架構中,HibernateTemplate封裝了Hibernate的代碼,提供了相當多有用的協助工具功能。Spring的HibernateTemplate可以幫我們完成這樣的工作,使用聲明式的配置來實現這樣的功能。既然使用了SSH整合,那就要充分利用好Spring的這個功能吧,當然如果你還擔心spring到底有沒有關閉session的話,不妨看看這個文章:【那個看起來有點2但不2的程式員做的一件事:驗證HibernateTemplate有沒有關閉session:http://songzj.iteye.com/blog/766148】

但是如果我們非得使用session來完成業務而又不想去管事務上的事,那就意味著我們放棄了上面所說的一切好處!

Spring,她依然可以幫我們完成這種有點BT的需求。

HibernateTemplate提供HibernateCallback,就是為了滿足這種使用了HibernateTemplate的情況下,仍然需要直接存取Session的需求而來的。它提供了在HibernateTemplate裡面直接存取Session的能力,程式員不必人為的管理session對象(這個就是使用HibernateCallback的原因http://blog.163.com/yeyhan/blog/static/44179333201022942856795/)。

首先,應該確保我們的DAO已經繼承了HibernateDaoSupport。

於是,如果我們可以參考如下形式書寫:

@SuppressWarnings("unchecked")public Page queryData(final String countSql, final String resultSql,final int startIndex, final int pageSize, final long total) {Page result = (Page) getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {long totalCount = 0;if (total < 0) {List countlist = session.createSQLQuery(countSql).list();totalCount += Long.parseLong(countlist.get(0).toString());} else {totalCount = total;}if (totalCount < 1) {return new Page();}// 實際查詢返回分頁對象Query query = session.createSQLQuery(resultSql).addScalar("carLsh", Hibernate.INTEGER).addScalar("carPic", Hibernate.STRING).addScalar("carInfo", Hibernate.STRING).addScalar("carColor", Hibernate.STRING).addScalar("carType", Hibernate.STRING).setResultTransformer(Transformers.aliasToBean(CarInfo.class));if (pageSize > 0) {if (startIndex < 0) {query.setFirstResult(0);} else if (startIndex >= totalCount) {return new Page();} else {query.setFirstResult(startIndex);}if (startIndex + pageSize > totalCount) {query.setMaxResults((int) totalCount- startIndex);} else {query.setMaxResults(pageSize);}}return new Page(startIndex, totalCount, pageSize, query.list());}});return result;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.