天天看點

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

在項目開發中,使用了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 >

                            if (startindex <

                                query.setfirstresult(0); 

                            } else

if (startindex >= totalcount) { 

                                return

                            } else { 

                                query.setfirstresult(startindex); 

                            } 

                            if (startindex + pagesize > totalcount) { 

                                query.setmaxresults((int) totalcount 

                                        - startindex); 

                                query.setmaxresults(pagesize); 

                        return

new page(startindex, totalcount, pagesize, query 

                                .list()); 

                    } 

                }); 

        return result; 

    }