天天看点

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; 

    }