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