对于J2EE 应用程序而言,事务的处理一般有两种模式:
1. 依赖特定事务资源的事务处理
这是应用开发中最常见的模式, 即通过特定资源提供的事务机制进行事务管理。
如通过JDBC、JTA的rollback、commit方法;Hibernate Transaction 的
rollback、commit方法等。这种方法大家已经相当熟悉。
2. 依赖容器的参数化事务管理
通过容器提供的集约式参数化事务机制,实现事务的外部管理,如EJB中的事
务管理模式。
如,下面的EJB事务定义中,将 SessionBean MySession的 doService方
法定义为Required。
也就是说,当 MySession.doServer 方法被某个线程调用时,容器将此线程
纳入事务管理容器,方法调用过程中如果发生异常,当前事务将被容器自动回
滚,如果方法正常结束,则容器将自动提交当前事务。
<container-transaction >
<method >
<ejb-name>MySession</ejb-name>
<method-intf>Remote</method-intf>
<method-name>doService</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
容器管理的参数化事务为程序开发提供了相当的灵活性,同时因为将事务委
托给容器进行管理,应用逻辑中无需再编写事务代码,大大节省了代码量(特
别是针对需要同时操作多个事务资源的应用) ,从而提高了生产率。
然而,使用 EJB 事务管理的代价相当高昂,撇开 EJB 容器不菲的价格,EJB
的学习成本,部署、迁移、维护难度,以及容器本身带来的性能开销(这往往
意味着需要更高的硬件配置)都给我们带来了相当的困惑。此时事务管理所带
来的优势往往还不能抵消上面这些负面影响。
配置案例:
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/sample</value>
</property>
<property name="username">
<value>user</value>
</property>
<property name="password">
<value>mypass</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTr
ansactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAO" class="net.xiaxin.dao.UserDAO">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean> SpringFrameWork Developer’s Guide Version 0.6
October 8, 2004 So many open source projects. Why not Open your Documents?
<bean id="userDAOProxy"
class="org.springframework.transaction.interceptor.Tran
sactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">
PROPAGATION_REQUIRED,readOnly
</prop>
</props>
</property>
</bean>
</beans>
Spring与EJB事务管理比较
1. Spring可以将任意Java Class 纳入事务管理
这里的UserDAO只是我们编写的一个普通 Java Class, 其中包含了一些
基本的数据应用逻辑。通过 Spring,我们即可简单的实现事务的可配置
化。也就是说,我们可以随意为某个类的某个方法指定事务管理机制。
与之对比,如果使用EJB容器提供的事务管理功能,我们不得不按照 EJB
规范编将UserDAO 进行改造,将其转换为一个标准的 EJB。
2、 Spring事务管理并不依赖特定的事务资源。
EJB 容器必须依赖于 JTA 提供事务支持。而 Spring 的事务管理则支持
JDBC、JTA 等多种事务资源。这为我们提供了更多的选择,从而也使得
我们的系统部署更加灵活。
posted on 2009-03-24 13:24
重庆理工小子 阅读(1067)
评论(0) 编辑 收藏 所属分类:
Spring2