對于J2EE 應用程序而言,事務的處理一般有兩種模式:
1. 依靠特定事務資源的事務處理
這是應用開發中最常見的模式,即通過特定資源提供的事務機制進行事務治理。
如通過JDBC、JTA 的rollback、commit方法;Hibernate Transaction 的rollback、commit方法等。這種方法大家已經相當熟悉。
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的學習成本,部署、遷移、維護難度,以及容器本身帶來的性能開銷(這往往意味著需要更高的硬件配置)都給我們帶來了相當的困惑。此時事務治理所帶來的優勢往往還不能抵消上面這些負面影響。
SPRing事務治理能給我們帶來什么?
下面這段xml配置片斷展示了Spring中的事務設定方式:
<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>
新聞熱點
疑難解答