shenang博客技术文档


理论不懂就实践,实践不会就学理论!

posts - 35,comments - 55,trackbacks - 0
 

对于J2EE 应用程序而言,事务的处理一般有两种模式:

1 依赖特定事务资源的事务处理

这是应用开发中最常见的模式, 即通过特定资源提供的事务机制进行事务管理。

如通过JDBCJTArollbackcommit方法;Hibernate Transaction

rollbackcommit方法等。这种方法大家已经相当熟悉。

 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>  

SpringEJB事务管理比较

1 Spring可以将任意Java Class 纳入事务管理

这里的UserDAO只是我们编写的一个普通 Java Class 其中包含了一些

基本的数据应用逻辑。通过 Spring,我们即可简单的实现事务的可配置

化。也就是说,我们可以随意为某个类的某个方法指定事务管理机制。

与之对比,如果使用EJB容器提供的事务管理功能,我们不得不按照 EJB

规范编将UserDAO 进行改造,将其转换为一个标准的 EJB

2 Spring事务管理并不依赖特定的事务资源

EJB 容器必须依赖于 JTA 提供事务支持。而 Spring 的事务管理则支持

JDBCJTA 等多种事务资源。这为我们提供了更多的选择,从而也使得

我们的系统部署更加灵活。

posted on 2009-03-24 13:24 重庆理工小子 阅读(1051) 评论(0)  编辑  收藏 所属分类: Spring2

只有注册用户登录后才能发表评论。


网站导航: