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。

于是,如果我们可以参考如下形式书写:

[java] view
plain
copy

  1. @SuppressWarnings("unchecked")  
  2.     public Page queryData(final String countSql, final String resultSql,  
  3.             final int startIndex, final int pageSize, final long total) {  
  4.         Page result = (Page) getHibernateTemplate().execute(  
  5.                 new HibernateCallback() {  
  6.                     public Object doInHibernate(Session session)  
  7.                             throws HibernateException, SQLException {  
  8.                         long totalCount = 0;  
  9.                         if (total < 0) {  
  10.                             List countlist = session.createSQLQuery(countSql)  
  11.                                     .list();  
  12.                             totalCount += Long.parseLong(countlist.get(0)  
  13.                                     .toString());  
  14.                         } else {  
  15.                             totalCount = total;  
  16.                         }  
  17.   
  18.                         if (totalCount < 1) {  
  19.                             return new Page();  
  20.                         }  
  21.   
  22.                         // 实际查询返回分页对象  
  23.                         Query query = session  
  24.                                 .createSQLQuery(resultSql)  
  25.                                 .addScalar("carLsh", Hibernate.INTEGER)  
  26.                                 .addScalar("carPic", Hibernate.STRING)  
  27.                                 .addScalar("carInfo", Hibernate.STRING)  
  28.                                 .addScalar("carColor", Hibernate.STRING)  
  29.                                 .addScalar("carType", Hibernate.STRING)  
  30.                                 .setResultTransformer(  
  31.                                         Transformers.aliasToBean(CarInfo.class));  
  32.   
  33.                         if (pageSize > 0) {  
  34.                             if (startIndex < 0) {  
  35.                                 query.setFirstResult(0);  
  36.                             } else if (startIndex >= totalCount) {  
  37.                                 return new Page();  
  38.                             } else {  
  39.                                 query.setFirstResult(startIndex);  
  40.                             }  
  41.   
  42.                             if (startIndex + pageSize > totalCount) {  
  43.                                 query.setMaxResults((int) totalCount  
  44.                                         - startIndex);  
  45.                             } else {  
  46.                                 query.setMaxResults(pageSize);  
  47.                             }  
  48.   
  49.                         }  
  50.                         return new Page(startIndex, totalCount, pageSize, query  
  51.                                 .list());  
  52.                     }  
  53.                 });  
  54.         return result;  
  55.     }  
时间: 2024-09-09 21:13:27

Spring session的相关文章

Spring Session 2.0.0.M1 发布,分布式解决方案

我很高兴地宣布Spring Session 2.0.0.M2 发布了.此版本的重点主要是确保与Spring Framework 5.0.0.RC2和Spring Data Kay-M4的兼容性.我们期望Spring Session 2.0.0.M3将拥有一个新的Java 8友好的API并支持Spring WebFlux. 完整内容请查看发行公告. 下载地址: Source code (zip) Source code (tar.gz) 版本更新内容请关注发布主页. 文章转载自 开源中国社区[ht

使用Spring Session实现Spring Boot水平扩展

本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请求反向代理到其他运行的Spring Boot应用上,如果系统需要增加吞吐量,只需要再启动更多的Spring Boot应用即可. Spring Boot应用通常会部署在多个Web服务器上同时提供服务,这样做有很多好处: 单个应用宕机不会停止服务,升级应用可以逐个升级而不必停止服务. 提高了应用整体的吞吐量.

利用AnnotationMethodHandlerAdapter对Spring的Controller注入session对象

在利用spring的mvc开发过程中,需要将User对象从session中取出来使用.参照网上的做法,我利用 了AnnotationMethodHandlerAdapter来解决这个问题.下面是XML代码,放到web-inf下面的springMVC配 置文件中: <bean id="userArgumentResolver" class="com.greatwall.module.yhqxgl.interceptor.UserArgumentResolver"

Spring Boot 负载均衡之外置session状态保存

在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而打到另外一台服务器的时候,session丢失.   常规的解决方案都是使用:如apache使用mod_jk.conf.   在开发spring boot app的时候可以借助 spring session 和redis,用外置的redis来存储session的状态.   直接上代码,我这边直接默认你使用spring boot,如果你是普通的spring we

5.10. Spring boot with Session share

5.10.1. Redis 5.10.1.1. Maven 增加下面代码到pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springfra

2.10. Spring boot with Session share

2.10.1. Redis 2.10.1.1. Maven 增加下面代码到pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springfra

php的session读写锁例子

先看一个例子,功能: 1.点击页面中一个按钮,ajax执行php,php中用session记录执行到哪一步. 2.使用ajax轮询另一个php,获取session中数据,输出执行到哪一步. session.html 调用php执行,并输出执行到第几步 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

Weblogic92中使用JDBC store存储session时问题分析

Weblogic92中,不少系统为了降低系统的内存开销,抑或防止session丢失,管理人员会是用JDBC store来存放session信息.不过在使用这种配置的时候,不少客户反映会碰到约束冲突的异常信息,如下, <Jan 23, 2009 10:07:33 AM CST> <Error> <HTTP Session> <BEA-100087> <The jdbc session data for session id: DcwFJ5mH1HbFrV

浅谈如何结合JDBC事务与Spring+Hibernate

问题:客户在其数据库操作过程中需要调用我们的工作流接口,这样就需要将我们的工作流操作与他 们的业 务操作置于同一个事务中.我们的服务采用的都是spring的声明式事务,而客户采用的是对 connection进行事务处理. 如何保证JDBC事务的一致性? 想到的解决方案一:使用jta事务,用tomcat+jotm提供事务管理器.为什么一开始就想到要使用jta事 务??实际上我们和客户都是使用的同一个数据库,为了方便,各自使用了不同的数据库连接方式,使用 jta的话确实有bt的意思在里面.但是事实上