- 浏览: 257180 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
zoukaiwolai:
...
Java 16进制字符串与2进制字符串相互转换 -
sooxin:
j2ee的事务对连接有自己的管理机制,包括建立和关闭。没进j2 ...
c3p0 spring 包没进事务管理,连接池就不能释放 -
sooxin:
mina 采用一种NIO通信,底层的连接机制没有具体研究过,但 ...
转 Mina框架在项目中的使用 -
tywo45:
写得很好,希望博主把格式调一下!
Tomcat性能参数设置介绍 -
freecode:
采用了cp30,项目中出现很多未关闭的连接,一直在找原因.
c3p0 spring 包没进事务管理,连接池就不能释放
记录我在使用spring,hibernate的时候遇到的session,和事务管理的问题.
spring用一个OpenSessionInView的filter来处理session was closed的问题.这个大家并不陌生.
我们项目当中的dao层有一个baseDao. 封装了一系列对持久化对象的操作方法.C,R,U,D 条件查询.分页查询.等等.而且baseDao当中的所有的find方法都是readOnly的,get和load直接调用的hibernateTemplate的get和load.当然service层当中的事务管理也是使用spring的那个事务模板.
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory">
- <ref local="sessionFactory" />
- </property>
- </bean>
- <bean id="txProxyTemplate" lazy-init="true" abstract="true"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager">
- <ref bean="transactionManager" />
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="save*">PROPAGATION_REQUIRED</prop>
- <prop key="del*">PROPAGATION_REQUIRED</prop>
- <prop key="update*">PROPAGATION_REQUIRED</prop>
- <prop key="create*">PROPAGATION_REQUIRED</prop>
- <prop key="add*">PROPAGATION_REQUIRED</prop>
- <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="txProxyTemplate" lazy-init="true" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="create*">PROPAGATION_REQUIRED</prop> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
以上配置都OK.
我遇到的问题有几个, 如下:
问题1,需要实现这样一个业务逻辑: 先把对象find出来.然后改变某个属性.然后在update. 在service当中就会写这样一个方法.changeOrder.在changeOrder当中先用dao的find.然后在用dao的update.理论上是可行的.因为service的事务都是被spring的事务模板托管.而且changeOrder得到的connection是可写的.(因为spring的事务模板根据对方法名的匹配来判断获得得connection类型).但是由于baseDao.当中的所有find方法都是 setReadyOnly(true). 这样.当在service执行任何find的时候.baseDao将强行把connection改为只读的.接下来在一个事务当中.任何update 和save动作都不能完成了.但是直接执行hibernateTemplate的get和load却不会出现这个问题.因为这个connection的属性是由spring的openSessionInView来处理的.在request一过来的时候spring会绑定一个session.到request.直至request结束.(在这段过程当中如果不认为改变connection的readOnly的属性.这个connection将会从请求一开始到结束都是可以写入的.)
解决的办法就是在自己的dao当中将find方法重载.将readOnly改为false.
问题2, 有两个方法.一个是get对象.一个是find对象.同样也是直接调用baseDao的get和find方法.
当我对一个对象进行编辑操作的时候发现service当中的update是有效的. 但是我find出来的对象.在利用service当中的update来更新却发现没有任何异常.但是就是更新不了对象.
后来才明白.get方法当中是没有对connection进行任何readOnly相关的操作.但是baseDao当中却设置了只读..这个时候又有一些疑问了. action并没有进行事务管理.当先调用service的find方法(也就是调用了baseDao中的find方法).这一个事务已经提交了.然后在继续调用service的update.为什么会更新不了对象?
原因就是在于OpenSessionInView.绑定的一个session对象在这一次的request当中.所以.从一次request.开始到结束.这个request仅仅会操作当前的一个session对象. 尽管在action当中连续调用的两次service方法都有两个不同的事务范围.在一整个请求当中还是只存在一个session对象.
所以第一个service的find方法执行完毕之后已经将当前request范围内的session改成了readOnly.以后的所有的service操作都是只读的.后面的service一些save或者update方法都会失效.....这就是OpenSessionInView和事务之间的微妙关系.
问题3,在ajax异步调用当中.经常也会出现这一系列的问题.其实原理大都是一样.因为ajax后来也是一个以.dwr结尾的请求.在OpenSessionInView当中加入一个filtermapping 为 .dwr 这样它会拦截所有的.dwr请求.在所有的ajax操作当中会绑定一个session对象.
总结一下: OpenSessionInView是一个filter.它会为每一个request绑定一个session.任何接下来在这一次请求当中所有的hibernate操作.都是基于当前请求的这个session的.任何service或者dao把当前的session对象改为了readOnly后.接下来所有save or update操作将进行不了.尽管他们不是在一个service方法(不是在同一个事务当中进行).
BTW.service在很大程度上是可以和dao层混合到一起.这样可以节约很多代码.但是.也会带来维护的时候非常的负责.并且麻烦.特别是readOnly 和session was closed问题.会另你非常的沮丧.
dao实际上是不需要用transaction来管理的.真正需要事务的是项目当中的service层.理解才是最重要的.用好OpenSessionInView会给项目带来极大的方便.
发表评论
-
Java中序列化的好处及意义
2019-07-26 15:38 11081、序列化是干什么的? ... -
小学语文课堂教学三维目标的制定和落实-广安齐祥娥
2019-07-06 11:31 15教学目标是教学过程中重要的一部分,它是教学的出发点 也是教学 ... -
深入研究Servlet线程安全性问题
2019-05-11 12:27 368Servlet(Server Applet)是 ... -
Java线程池
2019-05-11 12:25 456介绍new Thread的弊端及Java四种线程池的使用, ... -
Spring 事务的配置和使用详解(包括手动对事务的控制部分)
2019-04-05 15:28 820事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度 ... -
java 数据越界奇异问题
2016-05-19 00:31 600public class yy { public stat ... -
mysql 要 innodb引擎才支持事务
2015-04-03 21:53 820如题 ---------- -
Centos系统的单网卡绑定双ip的设置
2014-07-24 16:22 1129单个网卡,一个公网,一个内网ip的设置,可以参考下面的例子。 ... -
centeros java 显示乱码问题
2014-05-31 00:44 641vi /etc/sysconfig/i18n LANG=&q ... -
SmartFoxServer项目完成总结
2013-09-16 17:41 1151总体来说,如果是想做一个比较简单的虚拟现实服务,拿sfs来做还 ... -
centos6.2安装jdk1.6.0_30
2012-03-25 03:03 31121,卸载原来的openJDK:yum -y remove ja ... -
C3P0连接池详细配置
2011-10-09 17:21 848<c3p0-config> <defaul ... -
synchronized
2011-09-27 17:13 842synchronized 关键字,代表 ... -
c3p0 spring 包没进事务管理,连接池就不能释放
2011-05-25 16:20 3387c3p0 spring 包没进事务管理,连接池就不能释放 -
com.mysql.jdbc.CommunicationsException
2011-05-11 11:10 1047异常代码** BEGIN NESTED EXCEPTION * ... -
Eclipse 快捷键
2010-10-29 12:11 785Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl ... -
静态方法、单例模式区别
2010-10-28 21:54 3596关于这个问题,下面是一些同仁的观点:观点一:(单例)单例模 ... -
接口与抽象类有什么区别
2010-10-28 18:45 946abstract class和interface是Ja ... -
Java接口和Java抽象类 转
2010-10-25 17:24 871在没有好好地研习面向 ... -
as里回调函数
2010-10-16 14:44 1228/*** 回调函数 示例* 2010-8-26 9:52* @ ...
相关推荐
一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结
在构建企业级应用时,常常会采用Struts2、Hibernate和Spring这三种技术进行整合,形成SSH框架。这里我们主要讨论SSH项目中的Hibernate部分,它是一个强大的对象关系映射(ORM)框架,使得开发者可以方便地将数据库...
1.4. 小结中提到,本章重点介绍了Spring的环境配置和Spring Web MVC的基本架构及开发流程,为后续深入学习Spring和Hibernate打下了基础。 接下来,文档可能继续讲解如何集成Hibernate,实现数据持久化。Hibernate是...
一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结
#### 五、小结 本文详细介绍了Spring事务配置的五种方式,并以第一种方式为例进行了具体分析。通过了解这五种配置方式,开发者可以根据项目的实际情况选择最合适的方法来实现事务管理,从而提高系统的稳定性和可靠性...
"educationSelectItemInfos" executeResult="false" /> ...在实际项目中,还需要结合Hibernate进行持久层操作,以及Spring进行依赖注入和事务管理,共同构建出完整的SSH(Struts2 + Hibernate + Spring)企业级应用。
一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结
5. **事务管理**:Spring提供了声明式事务管理,允许开发者通过注解或者配置文件来定义事务边界,从而简化事务处理。 6. **AOP(面向切面编程)**:Spring的AOP模块允许我们在不修改原有业务代码的情况下,对程序...
- **广泛的集成支持**:Spring与其他Java技术栈(如Hibernate、MyBatis等)有很好的集成能力。 - **高度开放性**:Spring框架的设计非常灵活,用户可以选择性地使用其部分功能,而不是全盘接受。 总之,Spring框架...
#### 四、小结 通过对Struts2、Spring和Hibernate的整合,不仅能够构建出功能完善、性能优异的企业级应用,还能在开发过程中充分利用各框架的优势,降低系统的复杂度。希望以上内容能够帮助读者更好地理解和掌握这...
Spring可以作为它们之间的胶水,管理各层之间的依赖和事务。例如,通过`@Autowired`注解,Spring可以自动将服务层的bean注入到控制器层,而Hibernate的SessionFactory可以通过Spring的bean配置来管理。 总的来说,...
小结 (11.13) 对本章内容进行总结回顾,强调 Spring、Struts 和 Hibernate 整合的关键点及注意事项。 ### 结论 通过对《Spring+Struts+Hibernate 应用》的学习,我们可以了解到如何有效地将这三个框架整合起来,...
通过Spring管理的SessionFactory,我们可以创建Session,执行查询、更新等操作,同时,Spring还提供了事务管理,确保数据操作的原子性和一致性。 在数据库操作中,Spring的JdbcTemplate和...
6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5...
10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...
#### 六、小结 整合Struts2、Spring2与Hibernate3不仅提高了开发效率,也使得Web应用更加稳定和易于维护。通过以上步骤,可以快速搭建起一个具备基本CRUD功能的图书管理系统。这种集成方式对于初学者来说是非常有...
#### 五、小结 Spring框架提供了丰富的事务管理方式,使得开发者可以根据项目需求选择最适合自己的方案。通过本文的介绍,相信读者已经对Spring事务配置的五种方式有了更深入的理解。在实际开发过程中,开发者可...