對(duì)于J2EE 應(yīng)用程序而言,事務(wù)的處理一般有兩種模式:
1. 依賴特定事務(wù)資源的事務(wù)處理
這是應(yīng)用開(kāi)發(fā)中最常見(jiàn)的模式, 即通過(guò)特定資源提供的事務(wù)機(jī)制進(jìn)行事務(wù)管理。
如通過(guò)JDBC、JTA的rollback、commit方法;Hibernate Transaction 的
rollback、commit方法等。這種方法大家已經(jīng)相當(dāng)熟悉。
2. 依賴容器的參數(shù)化事務(wù)管理
通過(guò)容器提供的集約式參數(shù)化事務(wù)機(jī)制,實(shí)現(xiàn)事務(wù)的外部管理,如EJB中的事
務(wù)管理模式。
如,下面的EJB事務(wù)定義中,將 SessionBean MySession的 doService方
法定義為Required。
也就是說(shuō),當(dāng) MySession.doServer 方法被某個(gè)線程調(diào)用時(shí),容器將此線程
納入事務(wù)管理容器,方法調(diào)用過(guò)程中如果發(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ù)為程序開(kāi)發(fā)提供了相當(dāng)?shù)撵`活性,同時(shí)因?yàn)閷⑹聞?wù)委
托給容器進(jìn)行管理,應(yīng)用邏輯中無(wú)需再編寫事務(wù)代碼,大大節(jié)省了代碼量(特
別是針對(duì)需要同時(shí)操作多個(gè)事務(wù)資源的應(yīng)用) ,從而提高了生產(chǎn)率。
然而,使用 EJB 事務(wù)管理的代價(jià)相當(dāng)高昂,撇開(kāi) EJB 容器不菲的價(jià)格,EJB
的學(xué)習(xí)成本,部署、遷移、維護(hù)難度,以及容器本身帶來(lái)的性能開(kāi)銷(這往往
意味著需要更高的硬件配置)都給我們帶來(lái)了相當(dāng)?shù)睦Щ蟆4藭r(shí)事務(wù)管理所帶
來(lái)的優(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)用邏輯。通過(guò) Spring,我們即可簡(jiǎn)單的實(shí)現(xiàn)事務(wù)的可配置
化。也就是說(shuō),我們可以隨意為某個(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
重慶理工小子 閱讀(1073)
評(píng)論(0) 編輯 收藏 所屬分類:
Spring2