對(duì)于J2EE 應(yīng)用程序而言,事務(wù)的處理一般有兩種模式:
1. 依賴特定事務(wù)資源的事務(wù)處理
這是應(yīng)用開發(fā)中最常見的模式, 即通過特定資源提供的事務(wù)機(jī)制進(jìn)行事務(wù)管理。
如通過JDBC、JTA的rollback、commit方法;Hibernate Transaction 的
rollback、commit方法等。這種方法大家已經(jīng)相當(dāng)熟悉。
2. 依賴容器的參數(shù)化事務(wù)管理
通過容器提供的集約式參數(shù)化事務(wù)機(jī)制,實(shí)現(xiàn)事務(wù)的外部管理,如EJB中的事
務(wù)管理模式。
如,下面的EJB事務(wù)定義中,將 SessionBean MySession的 doService方
法定義為Required。
也就是說,當(dāng) MySession.doServer 方法被某個(gè)線程調(diào)用時(shí),容器將此線程
納入事務(wù)管理容器,方法調(diào)用過程中如果發(fā)生異常,當(dāng)前事務(wù)將被容器自動(dòng)回
滾,如果方法正常結(jié)束,則容器將自動(dòng)提交當(dāng)前事務(wù)。
<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>
容器管理的參數(shù)化事務(wù)為程序開發(fā)提供了相當(dāng)?shù)撵`活性,同時(shí)因?yàn)閷⑹聞?wù)委
托給容器進(jìn)行管理,應(yīng)用邏輯中無需再編寫事務(wù)代碼,大大節(jié)省了代碼量(特
別是針對(duì)需要同時(shí)操作多個(gè)事務(wù)資源的應(yīng)用) ,從而提高了生產(chǎn)率。
然而,使用 EJB 事務(wù)管理的代價(jià)相當(dāng)高昂,撇開 EJB 容器不菲的價(jià)格,EJB
的學(xué)習(xí)成本,部署、遷移、維護(hù)難度,以及容器本身帶來的性能開銷(這往往
意味著需要更高的硬件配置)都給我們帶來了相當(dāng)?shù)睦Щ蟆4藭r(shí)事務(wù)管理所帶
來的優(yōu)勢(shì)往往還不能抵消上面這些負(fù)面影響。
配置案例:
<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事務(wù)管理比較
1. Spring可以將任意Java Class 納入事務(wù)管理
這里的UserDAO只是我們編寫的一個(gè)普通 Java Class, 其中包含了一些
基本的數(shù)據(jù)應(yīng)用邏輯。通過 Spring,我們即可簡(jiǎn)單的實(shí)現(xiàn)事務(wù)的可配置
化。也就是說,我們可以隨意為某個(gè)類的某個(gè)方法指定事務(wù)管理機(jī)制。
與之對(duì)比,如果使用EJB容器提供的事務(wù)管理功能,我們不得不按照 EJB
規(guī)范編將UserDAO 進(jìn)行改造,將其轉(zhuǎn)換為一個(gè)標(biāo)準(zhǔn)的 EJB。
2、 Spring事務(wù)管理并不依賴特定的事務(wù)資源。
EJB 容器必須依賴于 JTA 提供事務(wù)支持。而 Spring 的事務(wù)管理則支持
JDBC、JTA 等多種事務(wù)資源。這為我們提供了更多的選擇,從而也使得
我們的系統(tǒng)部署更加靈活。
posted on 2009-03-24 13:24
重慶理工小子 閱讀(1083)
評(píng)論(0) 編輯 收藏 所屬分類:
Spring2