生活随笔
收集整理的這篇文章主要介紹了
Spring管理session的一些认识和用法心得
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在項目開發(fā)中,使用了SSH框架集成時,多處都會用到Session。在對Session的使用維護上,有如下幾種看法:
1.getCurrentSession();
獲得當前會話中的session,該session有容器自行維護管理,Spring可以代理事務。
2.this.getSession();
從當前的執(zhí)行中獲得或創(chuàng)建一個hibernate的session對象,需要自己手動關閉,以釋放連接資源。
3.openSession();
調用函數(shù)自行創(chuàng)建一個數(shù)據(jù)庫的連接,并將其打開,在使用Spring操作非查詢語句的請況下,Spring的事務對該session對象不起到事務管理的作用,所以該session對象應當由程序員自己關閉,釋放連接資源。
以上三種操作session的方式,我們都離不開這樣的操作主線:
打開Session,開始一個事務,處理異常,提交一個事務,最后關閉一個Session。
如果我們自己只專注于業(yè)務,不想去作這些重復而繁瑣的操作,那這樣的一套操作對我們來講太繁瑣了!
相信任何一個程序員,都不想重復敲著那一遍又一遍雷同的代碼!
在Spring的框架中,HibernateTemplate包裝了Hibernate的代碼,提供了相當多有用的輔助功能。Spring的HibernateTemplate可以幫我們完成這樣的工作,使用聲明式的配置來實現(xiàn)這樣的功能。既然使用了SSH集成,那就要充分利用好Spring的這個功能吧,當然如果你還擔心spring到底有沒有關閉session的話,不妨看看這個文章:【那個看起來有點2但不2的程序員做的一件事:驗證HibernateTemplate有沒有關閉session:http://songzj.iteye.com/blog/766148】
但是如果我們非得使用session來完成業(yè)務而又不想去管事務上的事,那就意味著我們放棄了上面所說的一切好處!
Spring,她依然可以幫我們完成這種有點BT的需求。
HibernateTemplate提供HibernateCallback,就是為了滿足這種使用了HibernateTemplate的情況下,仍然需要直接訪問Session的需求而來的。它提供了在HibernateTemplate里面直接訪問Session的能力,程序員不必人為的管理session對象(這個就是使用HibernateCallback的原因http://blog.163.com/yeyhan/blog/static/44179333201022942856795/)。
首先,應該確保我們的DAO已經(jīng)繼承了HibernateDaoSupport。
于是,如果我們可以參考如下形式書寫:
[java] view plaincopyprint?
@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;? ??? }?
總結
以上是生活随笔為你收集整理的Spring管理session的一些认识和用法心得的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。