對于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ī)制,實現(xiàn)事務(wù)的外部管理,如EJB中的事
務(wù)管理模式。
如,下面的EJB事務(wù)定義中,將 SessionBean MySession的 doService方
法定義為Required。
也就是說,當(dāng) MySession.doServer 方法被某個線程調(diào)用時,容器將此線程
納入事務(wù)管理容器,方法調(diào)用過程中如果發(fā)生異常,當(dāng)前事務(wù)將被容器自動回
滾,如果方法正常結(jié)束,則容器將自動提交當(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ù)撵`活性,同時因為將事務(wù)委
托給容器進(jìn)行管理,應(yīng)用邏輯中無需再編寫事務(wù)代碼,大大節(jié)省了代碼量(特
別是針對需要同時操作多個事務(wù)資源的應(yīng)用) ,從而提高了生產(chǎn)率。
然而,使用 EJB 事務(wù)管理的代價相當(dāng)高昂,撇開 EJB 容器不菲的價格,EJB
的學(xué)習(xí)成本,部署、遷移、維護(hù)難度,以及容器本身帶來的性能開銷(這往往
意味著需要更高的硬件配置)都給我們帶來了相當(dāng)?shù)睦Щ蟆4藭r事務(wù)管理所帶
來的優(yōu)勢往往還不能抵消上面這些負(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只是我們編寫的一個普通 Java Class, 其中包含了一些
基本的數(shù)據(jù)應(yīng)用邏輯。通過 Spring,我們即可簡單的實現(xiàn)事務(wù)的可配置
化。也就是說,我們可以隨意為某個類的某個方法指定事務(wù)管理機(jī)制。
與之對比,如果使用EJB容器提供的事務(wù)管理功能,我們不得不按照 EJB
規(guī)范編將UserDAO 進(jìn)行改造,將其轉(zhuǎn)換為一個標(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)
評論(0) 編輯 收藏 所屬分類:
Spring2