Spring事务控制

       JavaEE应用中的传统事务有两种策略:全局事务和局部事务,全局事务由应用服务器管理,需要底层服务JTA(java transaction API 支持分布式事务)支持。局部事务和底层所采用的持久化技术有关(JDBC,Hibernate……)。

 

        在spring中,spring采用观察者模式,通过PlatformTransactionManager接口体现,随着底层不同的事务策略来切换,应用不同的实现类。

 

        理论性的东西就不多说了,大家自己看吧,我也懂得不多,现在就写下spring中怎么配置JDBC,hibernate事务(JTA没有用过,在这里就不班门弄斧了)

        

        <!-- 连接池proxool配置,先配置数据源 -->
	<bean id="DataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
        <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="driverUrl"                                                                               value="jdbc:mysql://127.0.0.1:3306/home?characterEncoding=UTF-8">                      </property>
        <property name="user" value="****"></property>
        <property name="password" value="***"></property>
        <property name="alias" value="home_pool" />
    	<property name="prototypeCount" value="2" /> 
    	<property name="maximumConnectionCount" value="24" /> 
    	<property name="minimumConnectionCount" value="8" /> 
    	<property name="simultaneousBuildThrottle" value="24" /> 
    	<property name="maximumActiveTime" value="300000" />
    	<property name="houseKeepingSleepTime" value="99000" />
    	<property name="houseKeepingTestSql" value="select 1 from dual" />  
    </bean>


        JDBC局部事务管理器

       

    <bean id="transactionManager"
       class="org.springframework.jdbc.datesource.DataSourceTransactionManager">
        <property name="dateSource" ref="dateSource" />
    </bean>


 

        Hibernate需要配置sessionfactory

<!-- sessionFactory配置 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
        	<ref bean="DataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                
                <!-- 指定Hibernate持久化操作的批操作大小 -->
                <prop key="hibernate.jdbc.batch_size">30</prop>
                <prop key="hibernate.jdbc.fetch_size">50</prop>
                <prop key="hibernate.max_fetch_depth">1</prop>
                <prop key="hibernate.default_batch_fetch_size">10</prop>
                <prop key="hibernate.connection.release_mode">auto</prop>
                <prop key="hibernate.transaction.flush_before_completion">true</prop>
            </props>
        </property>
        
        <property name="mappingDirectoryLocations">
     		<list>
     			<value>classpath:/cn/life/entity</value>
     		</list>
     	</property>
	</bean>

  这里面的具体参数配置就不讲了,我们专门看事务配置

   

           HIbernate局部事务管理器

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


 ======================================================================================
       事务管理器配置好后,接下来就要为业务逻辑Bean配置事务代理了

   <bean id="newsDaoTrans" 
	        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
	<property name="target" ref="目标beanID" />
	<property name="transactionAttributes">
		<props>
			<prop key="*">PROPAGATION_REQUIRED</prop>
		</props>
	</property>
    </bean>


      AOP配置方式如下,用AOP记得引入AOP schema:

   <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="query*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="search*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="pagedQuery*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="display*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    
    <aop:config><!--给cn.life.*.service.*包下的所有方法加事务 -->
        <aop:pointcut id="interceptorPointCuts"
            expression="execution(* cn.life.*.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" 
            pointcut-ref="interceptorPointCuts" />        
    </aop:config> 

以上就把事务配置好了,两种配置方式我想,通过代码应该明白他们的优缺点了吧,TransactionProxyFactoryBean配置策略虽然易懂,但是配置反锁,每个目标bean都要配置,这会导致配置文件繁琐,tx命名空间配置事务管理就更加的简洁。当然tx还有更负责的配置及注解式事务配置,在这里就不深究了。

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值