Spring提供了JndiObjectFactoryBean類來支持第二種方式的數據源獲取。假設WAS中已經配置好的數據源名稱為jdbc /MyDB,那么用外部配置文件可配置如下:
或者
從上面配置我們可以得知,通過使用Spring,應用程序能夠統一使用不同的數據源實現。如果使用環境發生變化,那么只需要修改Spring的配置文件即可。對于部署在WAS上的Web應用,在生產環境中推薦使用WAS實現的數據庫連接池。一方面是因為連接池實現地比較完善。另一方面,使用WAS提供的數據庫連接池可以很完善地支持JTA事務。 2 使用WAS的JTA Web應用程序在使用事務的時候常常會涉及一個事務類型的選擇。是選擇像JDBC事務這樣的本地事務呢還是使用JTA支持的全局事務。這個與應用程序需要涉及到的事務管理器類型和個數密切相關。Spring本身不支持分布式事務,因此分布式事務需要底層的JTA。但是Spring提供了事務的抽象,即底層真正事務實現可以切換而不影響應用程序代碼。這樣應用程序可以依賴于底層WAS,也可以輕易地脫離開應用服務器的環境。這一點與前面數據源的抽象非常類似。 WAS本身對于事務劃分有兩種支持方式,一種是聲明式的,當然這種管理方式需要EJB容器的支持,即所謂的容器管理事務(CMT)。另外一種方式是編程式的,通過程序代碼來直接使用JTA編程接口。Spring對于事務的劃分也可以分為聲明式和編程式兩種方式。對于Spring編程式的事務劃分方式,總體上可以分為兩大類。一類是通過直接使用實現PlatformTransactionManager接口的類。另一類是通過使用TransactionTemplate模板類,模板類的使用可以簡化事務控制代碼。Spring對于聲明式事務劃分的支持實際上是利用了它的AOP機制。相對于編程式事務劃分,這種基于AOP的方式比較靈活,而且對代碼的侵入性幾乎為零。因此,如果沒有特殊需要推薦使用這種事務劃分方式。基于AOP的常用事務劃分方式可以使用ProxyFactoryBean加TransactionInterceptor方式,或者使用TransactionPorxyFactoryBean的方式。前一種方式相對比較靈活,而后一種則對使用相對比較簡單。 無論是哪一種事務劃分方式,底層都需要一個事務管理機制作為支撐。如果是單一的事務資源管理器,那么根據所使用的后臺事務管理資源不同的類型,可以選擇的PlatformTransactionManager實現有DataSourceTransactionManager,HibernateTransactionManager, JdoTransactionManager, PersistenceBrokerTransactionManager,和JmsTransactionManager等。無論是單個還是多個事務資源管理器,都可以使用JtaTransactionManager類。如果使用JtaTransactionManager,那么所有事務管理實際都會委托給底層應用服務器的JTA實現。 例如,如果使用JDBC或iBATIS,那么我們可以使用簡單的DataSourceTransactionManager,外部配置文件片斷如下:
如果使用Hibernate,那么我們可以使用HibernateTransactionManager,外部配置文件片斷如下:
使用WAS的JTA支持,我們只需要把上述對應bean中的class屬性改成class屬性改為org.springframework.transaction.jta.JtaTransactionManager,然后再把屬性改為WebSphere對應的TransactionManager,參考如下:
通過采用Spring的事務支持,底層事務采用何種方式的決定就不必在一開始開發就做出決定。因為我們能夠通過Spring的外部配置文件來進行切換真正的事務支持。不過,雖然也有第三方的JTA支持,但是WAS能夠提供非常穩定的XA支持,因此推薦使用WAS的JTA,尤其是當應用涉及到分布事務處理的時候。這樣無論應用涉及幾個事務資源都可以統一解決。 3 如何加載Spring的JAR包 Spring框架的核心JAR包是spring.jar,但是根據實際使用情況需要一些擴展JAR包和依賴JAR包。那在WAS中如何處理這些JAR包文件呢?在Web應用中一個簡單而直接的處理方式放是把這些使用到的JAR文件都拷貝到對應的WEB-INF/lib目錄下面。這種方法雖然簡單,但是當有多個Spring應用程序的時候這種處理方式就需要在每個應用的WEB-INF/lib目錄下都拷貝一份相同的JAR文件。這里可以通過共享庫的方式來統一解決類庫共享這個問題。 共享庫就是WAS專門用來解決不同應用程序之間共享JAR或本地庫文件的一種機制。共享庫由一個名字、一個JAVA類路徑和/或一個裝載JNI庫本地庫路徑組成。它可以分別在單元,節點和服務器級別定義。但是共享庫定義了并不意味著它會被裝載,只有當這個共享庫與某個應用程序或應用服務器關聯之后,它才會被加載。如果一個共享庫與一個應用程序關聯,那么這個共享庫由應用程序類加載器加載。如果一個共享庫與應用服務器關聯,那么這個共享庫就需要一個專門定義的類加載器來加載。這個類加載器需要用戶自己定義。其操作如下:選應用服務器比如server1'類加載器'新建一個類加載器'加載器與共享庫關聯。 在創建這個類加載器之前一般都需要預先定義好共享庫。 根據上面的介紹可知,通過共享庫解決Spring應用的JAR包共享問題,主要就是兩個步驟。一是,把Spring應用中需要共享的JAR包定義成為一個共享庫。二是,選定相應的WAS服務器實例,把它與上面創建的共享庫關聯起來。這樣此WAS服務器實例上的所有應用都能夠使用共享庫中定義的JAR包。使用共享庫這種方式的時候要注意理解類的裝載次序和方式。如果是這種與WAS服務器實例關聯的共享庫JAR包,其類加載器在層次結構上在應用程序類加載器上面,即是它的父加載器。關于WAS的類裝載器結構和策略可以進一步參考WAS信息中心。
轉自:http://www.golddot.com.cn/article/2830/Article90448_4.htm
http://www.golddot.com.cn/article/2830/Article90448_4.htm
Powered by: BlogJava Copyright © 沙漠中的魚