`
sunnymoon
  • 浏览: 89521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

配制无限制的Spring事务管理

    博客分类:
  • SSH
阅读更多

目录:V1.0
1.旧时的痛
2.光明来临前的黑暗
3.欢迎救世主


注:可自由转载,转载时需说明出处并请保持原样。

1.旧时的痛

为什么说配制无限制的Spring事务管理呢,估计肯定有哪位高手看过标题之后就会奇怪,配制事务管理还要有什么限制吗?
当然对您这样的高手当然是运用自如。但是还是和很多初识者甚至有很长的工作经验的朋友的老鸟对Spring配制只停留在spring1.x
阶段,并且仅限于配制Spring+Hibernate的事务管理。
最经典的Spring+Hibernate的配制是这样的:
<!-- 数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@192.168.0.150:1521:cisfedb"/> <property name="username" value="draftsa"/> <property name="password" value="draftsa"/> <property name="maxActive" value="100"/> <property name="maxIdle" value="30"/> <property name="maxWait" value="1000"/> <property name="defaultAutoCommit" value="true"/> <property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="60"/> </bean> <!-- 工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="lobHandler"> <ref bean="lobHandler"/> </property> <property name="mappingResources"> <list> <value>com/ecds/hibernate/EcdAuthlistdata.hbm.xml</value> <value>com/ecds/hibernate/PcdRediscountwithcb.hbm.xml</value> </list> </bean> <!-- 事务管理,用的hibernate 的 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- 事务代理,由spring 接管,配置性事务,aop 应用 --> <bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="del*">PROPAGATION_REQUIRED</prop> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="*">PROPAGATION_REQUIRED,-Exception</prop> </props> </property> </bean>

 
在使用时为每个service加入事务模版,其实这种方式已经很方便了,
但是限制了使用者的视野,让很多初学者误认为Spring的事务只针对Hibernate准备的。
这是Spring1.0时代的产物,深深的留下了持久层框架的烙印。
<bean id="commonService" parent="baseTxProxy">
<property name="target">
<bean class="com.ecds.service.common.impl.CommonServiceImpl">
<property name="icommonDao">
<ref bean="icommonDao"/>
</property>
</bean>
</property>
</bean>


2.光明来临前的黑暗
实际上Spring提供了多种事务管理器以供使用,而其中的一种才是Hibernate的,如下:

事务管理器的实例

 

目标

 

Org.springframwork.jdbc.datasource.DataSourceTransactionManager

 

用DBC的 DataSource 去管理事务

 

Org.springframwork.orm.hibernate.HibernateTransactionManager

 

当持久机制是Hibernate时的事务管理器

 

Org.springframework.orm.jdoTransactionManager

 

当持久机制是JDO时的事务管理器

 

Org.springframework.transaction.jta.JtaTransactionManager

 

用JTA管理事务

 

Org.springframwork.orm.ojb.PersistenceBrokerTransactionManager

 

当持久机制是apache的OJB时的事务管理器


也就是说以下配制中的class使用不同的事务管理器可以应用在不同的持久层机制上,其中的DataSourceTransactionManager是最为通用的管理器。
有很多人在论坛里问:在Hibernate中是这样配制事务管理的,那么在某某下是如何配制呢,问的人不深问题的本身,而是只注重于解决事情的方式上。
当然这时用数据源的方式不是用sessionFactory,这种情况下就是在Spring1.x下的通用方式。

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
 

3.欢迎救世主

下面来介绍一下在Spring2.x达到相同的通用方式,并且配制起来更简洁和灵活的方式,当然和上面一样通用的方式就要使用通用的数据源(DataSource管理器)。

<!-- 数据源 -->
<bean id="vbank_ds_master" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${vbank.master.jdbc.driverClassName}"/>
        <property name="url" value="${vbank.master.jdbc.url}"/>
        <property name="username" value="${vbank.master.jdbc.username}"/>
        <property name="password" value="${vbank.master.jdbc.password}"/>
        <property name="maxActive" value="30"/>
        <property name="maxIdle" value="10"/>
        <property name="maxWait" value="1000"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="removeAbandoned" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>
        <property name="logAbandoned" value="false"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="validationQuery" value="select 1"/>
        <property name="poolPreparedStatements" value="true"/>
        <property name="timeBetweenEvictionRunsMillis" value="3600000"/>
        <property name="minEvictableIdleTimeMillis" value="18000000"/>
    </bean>
<!-- AOP: Configuration and Aspects -->
<aop:config>
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="0"/>
</aop:config>
<!-- 默认时自动注入id为transactionManager的事务管理器,否则需指定事务管理器id名称 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
   <tx:method name="get*" read-only="true"/>
   <tx:method name="find*" read-only="true"/>
<tx:method name="*" rollback-for="Exception,DataAccessException"/>
</tx:attributes>
</tx:advice>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="vbank_ds_master"/>
    </bean>
   
你会发现根本不需要事务模版了,由正则表达式来限定对Service的事务管理:pointcut="execution(* *..service.*Manager.*(..))" 
这样的方式是不是使你忘记了Spring中使用了什么持久层框架,是的,这时你就自由了!~
是不是想问我用了什么框架,我可以很负责任的告诉你是iBatis,你是不是没有看出来呢
下面是Service的配制,在Service中注入Dao,在Dao中注入SqlMapClientFactoryBean。
<!-- Service -->
<bean id="userAccountManager" class="com.m312.vbank.service.impl.UserAccountManagerImpl">
        <property name="genericMasterDao">    
            <bean class="com.m312.vbank.dao.ibatis.UserAccountDaoiBatis" parent="writeDao"/>     
        </property>   
        <property name="genericSlaveDao">      
            <bean class="com.m312.vbank.dao.ibatis.UserAccountDaoiBatis" parent="readDao"/>       
        </property>
    </bean>
<!-- Dao -->
<bean id="readDao" class="com.m312.vbank.dao.ibatis.GenericDaoiBatis" abstract="true">
        <!-- <property name="dataSource" ref="vbank_ds_slave"/>  -->
        <property name="sqlMapClient" ref="vbank_sqlmap_slave"/>
        <property name="sqlExecutor" ref="sqlExecutor"/>
        
    </bean>
<!-- ibatis Factory -->
<bean id="vbank_sqlmap_master" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="dataSource" ref="vbank_ds_master"/>
        <property name="configLocation" value="classpath:/sqlmap-vbank.xml"/>
    </bean>
<!-- 方言 -->
<bean id="sqlExecutor"
          class="com.m312.database.ibatis.LimitSqlExecutor">
        <property name="dialect">
            <bean class="com.m312.database.ibatis.MySQLDialect"/>
        </property>
    </bean>
 
好了,到些为止吧。
由于个人的技术和知识水平有限,难免有疏漏之处,请指正!

 

分享到:
评论
4 楼 gloomsun 2009-07-20  
事务是一个很复杂的过程,在我使用的过程中,比如对两个或者更多数据库的事物管理,不是简单的!
3 楼 phenom 2009-07-18  
关于配置的多了去了,没见过你这样马虎的,不是我不懂,我觉得你上面的代码没有足够的说明性的语句,会弄得别人搞不清楚.
可能是我多心了,
2 楼 sunnymoon 2009-07-18  
phenom 写道
<!-- AOP: Configuration and Aspects -->
<aop:config>
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="0"/>
</aop:config>
<!-- 默认时自动注入id为transactionManager的事务管理器,否则需指定事务管理器id名称 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
   <tx:method name="get*" read-only="true"/>
   <tx:method name="find*" read-only="true"/>
<tx:method name="*" rollback-for="Exception,DataAccessException"/>
</tx:attributes>
</tx:advice>
只是这里不一样了.不过没有说明上面的GET,FIND是什么东东.让不懂的人更不懂,让懂的人...........
你这样配置该不是每个service,manager 里的get,find都配置一样的事务吧.有必要这样么?



这块和要讲的事务重点无关,说一说也无妨,这里的意思是把查询类的操作设置为只读(可能为了提高性能和安全性),
*的匹配所有的操作,意思是发生异常时事物回滚。
"execution(* *..service.*Manager.*(..))"这是正则表达式,见意你看一下基础的后仍解决不了再问。
1 楼 phenom 2009-07-18  
<!-- AOP: Configuration and Aspects -->
<aop:config>
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="0"/>
</aop:config>
<!-- 默认时自动注入id为transactionManager的事务管理器,否则需指定事务管理器id名称 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
   <tx:method name="get*" read-only="true"/>
   <tx:method name="find*" read-only="true"/>
<tx:method name="*" rollback-for="Exception,DataAccessException"/>
</tx:attributes>
</tx:advice>
只是这里不一样了.不过没有说明上面的GET,FIND是什么东东.让不懂的人更不懂,让懂的人...........
你这样配置该不是每个service,manager 里的get,find都配置一样的事务吧.有必要这样么?

相关推荐

    配制Spring事务和JdbcTemplate使用

    配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用

    spring事物的五种配制方法

    ### Spring事务的五种配置方法详解 #### 一、引言 在软件开发过程中,事务管理是确保数据一致性的重要手段之一。Spring框架提供了强大的事务管理功能,能够方便地与多种数据库交互,支持不同的数据访问技术如JDBC、...

    Spring 注解 方式配制的小demo

    首先,我们来看标题"Spring 注解 方式配制的小demo",这意味着我们将学习如何创建一个简单的Spring应用,该应用完全基于注解进行配置。在传统的Spring配置中,我们需要在XML文件中定义bean及其属性,但使用注解配置...

    Spring xml 方式配制的小demo

    本篇文章主要讲解Spring框架中的XML配置方式,帮助开发者理解如何通过XML配置文件来管理Bean的生命周期和装配。 1. **Spring XML配置基础** Spring框架的配置文件通常以`applicationContext.xml`命名,这是Spring...

    SSH中applicationContext.xml如何配制事务

    在SSH的applicationContext.xml 中如何配制配制事务

    webwork2.2.4+spring+hibernate做的一个登入程序

    最近在做个项目,用的是webwork+spring+hibernate,在网上看了不少webwork+spring的配制方式,大多都是老的配制方式,比如2.1.7的,webwork2.2.4新加了很多功能,和spring的配制也简单了很多,我做了一个简单的登录...

    ssh配制文件详解

    总的来说,SSH框架的配置文件主要涉及数据库连接池的设置、Hibernate的SessionFactory配置、事务管理以及Spring的AOP代理。理解并正确配置这些文件对于搭建和维护基于SSH的Java Web应用程序至关重要。通过合理配置,...

    评律师事务所提成分配制.doc

    评律师事务所提成分配制.doc

    消毒液的配制PPT课件.pptx

    【84消毒液的配制知识】 84消毒液是一种常用的含氯消毒剂,主要成分为次氯酸钠,其有效氯含量通常在5%左右。有效氯是衡量消毒液消毒能力的重要指标,它决定了消毒液的消毒效果。在实际应用中,我们需要根据消毒需求...

    缓冲溶液配制方法.pdf

    "缓冲溶液配制方法" 缓冲溶液是指一种能够维持一定pH范围的溶液,广泛应用于生物化学、药学、医学等领域。缓冲溶液配制方法是指对缓冲溶液的制备和调整过程。缓冲溶液的配制方法多种多样,本文将介绍七种常见的缓冲...

    模拟水配制及地层水矿化度计算程序

    模拟水配制及地层水矿化度计算程序

    Citrix 5.5管理工具初始配制手册

    Citrix 5.5管理工具初始配制手册所涉及的知识点主要围绕Citrix的访问管理控制台(Citrix Access Management Console)的介绍与使用指南。Citrix Access Management Console是Citrix系统中用于管理和配置的一个核心...

    消毒液配制规定培训讲学.pdf

    消毒液在IT行业中虽然不是直接相关的专业知识...总的来说,虽然IT行业的主要关注点在于技术和信息处理,但环境卫生管理同样重要。正确配制和使用消毒液是维持工作环境安全、减少设备损坏风险、保障员工健康的基础步骤。

    常用的WEB项目配制文件modle

    Spring是一个全面的Java企业级应用框架,提供了依赖注入、AOP(面向切面编程)、数据访问和事务管理等功能。Spring的配置文件可以是`applicationContext.xml`或`beans.xml`,用于定义Bean的实例化、依赖关系和生命...

    消毒剂配制使用管理规程2016.2.9.docx

    因此,制定一套详尽的《消毒剂配制使用管理规程》显得尤为重要。这一规程,旨在指导洁净区内的人员正确选择、配制和使用消毒剂,保证消毒效果的同时,最大限度减少对产品质量和环境的影响。 规程开篇即指出,在选择...

    消毒剂配制使用管理规程2016.2.9.doc

    《消毒剂配制使用管理规程2016.2.9》是一份详细阐述洁净区消毒剂选择、使用和管理的规范文档。该规程旨在确保生产环境的卫生标准,防止消毒剂对产品产生负面影响,同时保障人员安全。以下是对规程主要内容的详细解析...

    试剂配制小标签十六.pdf

    在实验室工作尤其是疾病控制与预防领域,试剂的配制与管理是至关重要的环节。"试剂配制小标签十六.pdf" 文件显然是一份关于试剂管理的标准模板,主要用于记录和跟踪疾控中心内各种试剂的信息。这份标签包含了几个...

    医疗机构制剂配制监督管理办法(试行).doc

    医疗机构制剂配制监督管理办法(试行)

    盐酸标准溶液的配制与标定.ppt )

    盐酸标准溶液的配制与标定方法、数据处理、结果计算

    包衣液配制标准操作程序.doc

    包衣液配制标准操作程序是制药行业中一项关键的生产环节,主要应用于药物制剂的薄膜包衣过程。这种操作程序的设立旨在确保包衣液的配制符合严格的工艺质量和安全标准,以保证最终产品的质量和稳定性。 1. **目的**...

Global site tag (gtag.js) - Google Analytics