文档章节

spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 1733
阅读 24
收藏 0
点赞 0
评论 0

  为了弄清楚spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的,可监控以下类的日志:
  org.springframework.orm.hibernate3.support.OpenSessionInViewFilter,
  org.springframework.orm.hibernate3.HibernateTransactionManager,
  org.hibernate.transaction.JDBCTransaction,
  org.hibernate.impl.SessionImpl
具体可参考下面的配置:

<appender name="sessionTransactionAppender" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="session_transaction.log" />
		<param name="Append" value="false" />
		<param name="Threshold" value="DEBUG" />
		<param name="DatePattern" value="'.'yyyy-MM-dd" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%t] %d %-5p [%c] %m%n" />
		</layout>
	</appender>
	<category name="org.hibernate.impl.SessionImpl">
  	  <priority value="ALL" />
      <appender-ref ref="sessionTransactionAppender"/>
	</category>
    <category name="org.springframework.orm.hibernate3.HibernateTransactionManager">
  	  <priority value="ALL" />
      <appender-ref ref="sessionTransactionAppender"/>
	</category>
	<category name="org.springframework.orm.hibernate3.support.OpenSessionInViewFilter">
  	  <priority value="debug" />
      <appender-ref ref="sessionTransactionAppender"/>
	</category>

下面是在一个不使用OpenSessionInViewFilter的项目中,一次请求(所有条目都是在一个线程里的)调用两次getAllForumGroups方法(此方法上声明了事务控制)打出的日志:
日志中可以清楚地看到:每次事务开启时会打开一个新的session,事务结束时会关闭该session,session不再和当前线程绑定。

[7143355@qtp-21544349-0] 2011-03-28 15:39:33,304 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 5330116498333696
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,698 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Creating new transaction with name [oobbs.application.service.forum.ForumGroupService.getAllForumGroups]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,700 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 5330116500275200
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,701 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Opened new Session [org.hibernate.impl.SessionImpl@a0e220] for Hibernate transaction
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,712 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@a0e220]
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,737 DEBUG [org.hibernate.transaction.JDBCTransaction] begin
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,739 DEBUG [org.hibernate.transaction.JDBCTransaction] current autocommit status: true
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,740 DEBUG [org.hibernate.transaction.JDBCTransaction] disabling autocommit
[7143355@qtp-21544349-0] 2011-03-28 15:39:33,746 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Exposing Hibernate transaction as JDBC transaction [org.apache.commons.dbcp.PoolableConnection@1ac9683]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,205 DEBUG [org.hibernate.impl.SessionImpl] initializing proxy: [oobbs.domainmodel.user.User#-1]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,419 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Initiating transaction commit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,423 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@a0e220]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,426 DEBUG [org.hibernate.transaction.JDBCTransaction] commit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,447 DEBUG [org.hibernate.transaction.JDBCTransaction] re-enabling autocommit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,452 DEBUG [org.hibernate.transaction.JDBCTransaction] committed JDBC Connection
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,458 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Closing Hibernate Session [org.hibernate.impl.SessionImpl@a0e220] after transaction
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,464 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Creating new transaction with name [oobbs.application.service.forum.ForumGroupService.getAllForumGroups]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,465 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 5330116503408640
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,466 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Opened new Session [org.hibernate.impl.SessionImpl@f7d5a6] for Hibernate transaction
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,469 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@f7d5a6]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,470 DEBUG [org.hibernate.transaction.JDBCTransaction] begin
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,474 DEBUG [org.hibernate.transaction.JDBCTransaction] current autocommit status: true
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,476 DEBUG [org.hibernate.transaction.JDBCTransaction] disabling autocommit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,478 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Exposing Hibernate transaction as JDBC transaction [org.apache.commons.dbcp.PoolableConnection@1ac9683]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,652 DEBUG [org.hibernate.impl.SessionImpl] initializing proxy: [oobbs.domainmodel.user.User#-1]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,795 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Initiating transaction commit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,796 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@f7d5a6]
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,798 DEBUG [org.hibernate.transaction.JDBCTransaction] commit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,804 DEBUG [org.hibernate.transaction.JDBCTransaction] re-enabling autocommit
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,805 DEBUG [org.hibernate.transaction.JDBCTransaction] committed JDBC Connection
[7143355@qtp-21544349-0] 2011-03-28 15:39:34,810 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Closing Hibernate Session [org.hibernate.impl.SessionImpl@f7d5a6] after transaction

  下面是在一个使用了OpenSessionInViewFilter的项目中,一次请求(所有条目都是在一个线程里的)调用两次getRole方法(此方法上声明了事务控制)打出的日志:
日志中可以清楚地看到:请求刚发起时就会创建一个session实例,并绑定到当前线程上,至请求结束时,关闭该线程。在请求期间所有事务都使用这一个session。
  另一方面我们还可以看到:数据库连接connection保持打开的时间正是事务从开始到提交的时间,为了测试,getRole方法中故意设定了3秒的延迟,从日志上看出数据库连接也基本上维持了3秒。这是很多系统出现无法获取数据库连接问题的原因。在一个使用了连接池的系统里,连接数有一个最大上限,如果某个请求的处理耗时过长,则当前数据库连接在短时间内就得不到释放。当前并发访问量急速上升时,连接池的连接用会迅速用光,导致后续的请求因无法得到数据库连接而失败。
  最后,至于为什么只需要保证session一直打开就能避免lazy loading时不报错,原因就在于,观察下面的log可以发现,每当在事务期间时autocommit就被禁用,事务一执行完毕就又恢复至可用。这样,在jsp页面上读取lazy对象时,并不是以事务方式进行的,而是以autocommit的方式提交select语句的。因此只需要保持session打开即可,无需事务的支持。

[http-8080-4] 2011-03-28 15:25:59,367 DEBUG [org.springframework.orm.hibernate3.support.OpenSessionInViewFilter] Using SessionFactory 'sessionFactory' for OpenSessionInViewFilter
[http-8080-4] 2011-03-28 15:25:59,367 DEBUG [org.springframework.orm.hibernate3.support.OpenSessionInViewFilter] Opening single Hibernate Session in OpenSessionInViewFilter
[http-8080-4] 2011-03-28 15:25:59,367 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 5330113164767232
[http-8080-4] 2011-03-28 15:25:59,439 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Found thread-bound Session [org.hibernate.impl.SessionImpl@1d8f985] for Hibernate transaction
[http-8080-4] 2011-03-28 15:25:59,439 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Creating new transaction with name [sf.demo.RoleService.getRole]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT;
[http-8080-4] 2011-03-28 15:25:59,439 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@1d8f985]
[http-8080-4] 2011-03-28 15:25:59,439 DEBUG [org.hibernate.transaction.JDBCTransaction] begin
[http-8080-4] 2011-03-28 15:25:59,439 DEBUG [org.hibernate.transaction.JDBCTransaction] current autocommit status: true
[http-8080-4] 2011-03-28 15:25:59,439 DEBUG [org.hibernate.transaction.JDBCTransaction] disabling autocommit
[http-8080-4] 2011-03-28 15:25:59,440 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Exposing Hibernate transaction as JDBC transaction [com.mchange.v2.c3p0.impl.NewProxyConnection@16f7142]
[http-8080-4] 2011-03-28 15:26:02,440 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Initiating transaction commit
[http-8080-4] 2011-03-28 15:26:02,440 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@1d8f985]
[http-8080-4] 2011-03-28 15:26:02,440 DEBUG [org.hibernate.transaction.JDBCTransaction] commit
[http-8080-4] 2011-03-28 15:26:02,442 DEBUG [org.hibernate.transaction.JDBCTransaction] re-enabling autocommit
[http-8080-4] 2011-03-28 15:26:02,443 DEBUG [org.hibernate.transaction.JDBCTransaction] committed JDBC Connection
[http-8080-4] 2011-03-28 15:26:02,443 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Not closing pre-bound Hibernate Session [org.hibernate.impl.SessionImpl@1d8f985] after transaction
[http-8080-4] 2011-03-28 15:26:02,443 DEBUG [org.hibernate.impl.SessionImpl] disconnecting session
[http-8080-4] 2011-03-28 15:26:02,445 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Found thread-bound Session [org.hibernate.impl.SessionImpl@1d8f985] for Hibernate transaction
[http-8080-4] 2011-03-28 15:26:02,445 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Creating new transaction with name [sf.demo.RoleService.getRole]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT;
[http-8080-4] 2011-03-28 15:26:02,445 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@1d8f985]
[http-8080-4] 2011-03-28 15:26:02,445 DEBUG [org.hibernate.transaction.JDBCTransaction] begin
[http-8080-4] 2011-03-28 15:26:02,445 DEBUG [org.hibernate.transaction.JDBCTransaction] current autocommit status: true
[http-8080-4] 2011-03-28 15:26:02,446 DEBUG [org.hibernate.transaction.JDBCTransaction] disabling autocommit
[http-8080-4] 2011-03-28 15:26:02,446 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Exposing Hibernate transaction as JDBC transaction [com.mchange.v2.c3p0.impl.NewProxyConnection@1fb8de1]
[http-8080-4] 2011-03-28 15:26:05,447 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Initiating transaction commit
[http-8080-4] 2011-03-28 15:26:05,447 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Committing Hibernate transaction on Session [org.hibernate.impl.SessionImpl@1d8f985]
[http-8080-4] 2011-03-28 15:26:05,447 DEBUG [org.hibernate.transaction.JDBCTransaction] commit
[http-8080-4] 2011-03-28 15:26:05,449 DEBUG [org.hibernate.transaction.JDBCTransaction] re-enabling autocommit
[http-8080-4] 2011-03-28 15:26:05,450 DEBUG [org.hibernate.transaction.JDBCTransaction] committed JDBC Connection
[http-8080-4] 2011-03-28 15:26:05,450 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] Not closing pre-bound Hibernate Session [org.hibernate.impl.SessionImpl@1d8f985] after transaction
[http-8080-4] 2011-03-28 15:26:05,450 DEBUG [org.hibernate.impl.SessionImpl] disconnecting session
[http-8080-4] 2011-03-28 15:26:08,680 DEBUG [org.springframework.orm.hibernate3.support.OpenSessionInViewFilter] Closing single Hibernate Session in OpenSessionInViewFilter

本文转载自:http://blog.csdn.net/bluishglc/article/details/6283871

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0 ⋅ 05/18 ⋅ 0

spring 的OpenSessionInViewFilter简介【转】

目标类org.appfuse.service.impl.BaseManager 的 save 方法的事务类型PROPAGATION_REQUIRED ,remove 方法的事务类型PROPAGATIONREQUIRED 其他的方法的事务类型是PROPAGATIONREQUIRED,readO...

周禄康 ⋅ 2010/04/14 ⋅ 0

Write operations are not allowed in read-only mode (FlushMode.MANUAL):

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO o......

Jialy ⋅ 2016/11/18 ⋅ 0

spring声名式事务管理以及session生命周期

项目是spring+hibernate+struts框架,数据层BaseDaoImpl中的 SessionFactory是通过注解方式,由spring来提供的实例。session 用的是 sessionFactory.getCurrentSession()来获取的,项目运行时...

山如 ⋅ 2017/11/02 ⋅ 0

hibernate学习笔记-关闭session之后如何进行懒加载《二》

当在使用Hibernate做开发的时候出现org.hibernate.LazyInitializationException: could not initialize proxy - no Session 错误提示 病症:这是一个lazy使用后的Exception,使用迟时加载,在...

xiaml ⋅ 2014/04/09 ⋅ 0

OpenSessionInViewFilter作用及配置

一、作用 Spring为我们解决Hibernate的Session的关闭与开启问题。 Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如...

liangyx ⋅ 2012/10/23 ⋅ 0

OpenSessionInViewFilter 对 lazy 加载 的配置及作用

spring为我们解决hibernate的Session的关闭与开启问题。 问题: Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果...

JackMo2015 ⋅ 2016/11/28 ⋅ 0

hibernate 延迟加载的错误 failed to lazily initialize

这个问题一般出现在一对多的情况下,解决的方法有两种 1、设置lazy=false 如果是用annotation,则配置如下 @OneToMany( targetEntity = CourseAuthorizationItem.class, cascade = {Cascade...

长平狐 ⋅ 2013/01/06 ⋅ 0

HibernateTemplate 和HibernateDaoSupport的session

今天学习了下HibernateTemplate 和HibernateDaoSupport的session的区别。HibernateTemplate类中的方法是spring封装了hibernate中的方法,在使用完了以后会自动释放session。而如果使用了Hib...

Zero零_度 ⋅ 2015/05/28 ⋅ 0

springboot之Redis的使用

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lis...

无语年华 ⋅ 05/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 11分钟前 ⋅ 0

数据仓库技术概述(一看就是架构师写的,对我极其有用)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于...

gulf ⋅ 12分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 14分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 18分钟前 ⋅ 0

vue获取input输入框的数据

用惯了jQuery,突然使用vue感觉很不习惯,有很多不同的地方,感觉是两个不同的思想来写前端的代码。jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作。而Vue则是通过...

王子城 ⋅ 20分钟前 ⋅ 0

竟然这就是面向对象的游戏设计?!

从程序角度考虑,许多 JavaScript 都基于循环和大量的 if/else 语句。在本文中,我们可了解一种更聪明的做法 — 在 JavaScript 游戏中使用面向对象来设计。本文将概述原型继承和使用 JavaSc...

柳猫 ⋅ 25分钟前 ⋅ 2

git cmd git bash

刚用到了Git,看到windows环境下有两个命令输入窗口 第一个是可视化图形界面,第二个是CMD,第三个是Bash。 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的...

东东笔记 ⋅ 27分钟前 ⋅ 0

分布式系统CAP和Base

1、分布式系统 1.1 简介 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的...

xixingzhe ⋅ 38分钟前 ⋅ 0

查看磁盘占用情况

记一次jenkins构建失败的问题 Build step 'Send build artifacts over SSH' changed build result to UNSTABLE 网上查资料都没明确表明是什么错,回忆之前处理这样的问题。第一时间想到的是不...

ManderSF ⋅ 40分钟前 ⋅ 0

数据库管理提速:SQL解析的探索与应用

前言: SQL解析是一项复杂的技术,一般都是由数据库厂商来掌握,当然也有公司专门提供SQL解析的API。SQL解析与优化是属于编译器范畴,和C语言等其他语言的解析没有本质的区别。其中分为词法分...

java高级架构牛人 ⋅ 46分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部