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