spring與websphere應(yīng)用服務(wù)器的配合 spring與底層j2ee應(yīng)用服務(wù)器還是存在一些需要結(jié)合的地方,這里給出was中的一些結(jié)合點。 使用was數(shù)據(jù)源 在java應(yīng)用程序中,數(shù)據(jù)庫的連接一般有兩種方式來得到。一種是通過java.sql.drivermanager的方式來得到數(shù)據(jù)庫連接。這種方式不依賴于應(yīng)用服務(wù)的支持,但是也不提供數(shù)據(jù)庫連接池的功能。另外一種方式是通過javax.sql.datasource的方式來得到數(shù)據(jù)庫連接。在傳統(tǒng)基于j2ee的應(yīng)用需要通過jndi來得到數(shù)據(jù)源(javax.sql.datasource)對象,然后再通過數(shù)據(jù)源來得到相應(yīng)的數(shù)據(jù)庫連接。常見的應(yīng)用服務(wù)器都支持這種方式,且一般都提供了數(shù)據(jù)庫連接池的支持。雖然說我們一般推薦使用數(shù)據(jù)庫連接池,但是也有一些時候我們需要脫離開應(yīng)用服務(wù)器的環(huán)境使用數(shù)據(jù)庫(比如單元測試,比如應(yīng)用移植等)。然而應(yīng)用程序使用這兩種方式的時候代碼是不一樣的,因此只能通過代碼來應(yīng)變。spring提供了一個統(tǒng)一使用數(shù)據(jù)源的解決方案,然后通過控制反轉(zhuǎn)的機(jī)制用外部配置文件來指定使用的數(shù)據(jù)源。這樣一方面可以統(tǒng)一這兩種得到數(shù)據(jù)庫連接的方式,另一方面也不需要像通常的j2ee應(yīng)用通過繁瑣的jndi代碼來得到數(shù)據(jù)源。這樣應(yīng)用程序也就不需要知道使用的何種數(shù)據(jù)源。 spring提供了一個drivermanagerdatasource類來統(tǒng)一第一種方式的數(shù)據(jù)源獲取。如果使用was中的cloudscape數(shù)據(jù)庫,用外部配置文件可配置如下:com.ibm.db2j.jdbc.db2jdriver jdbc:db2j:d:\\dbname
spring提供了jndiobjectfactorybean類來支持第二種方式的數(shù)據(jù)源獲取。假設(shè)was中已經(jīng)配置好的數(shù)據(jù)源名稱為jdbc /mydb,那么用外部配置文件可配置如下:
java:comp/env/jdbc/mydb 或者 jdbc/mydb true
從上面配置我們可以得知,通過使用spring,應(yīng)用程序能夠統(tǒng)一使用不同的數(shù)據(jù)源實現(xiàn)。如果使用環(huán)境發(fā)生變化,那么只需要修改spring的配置文件即可。對于部署在was上的web應(yīng)用,在生產(chǎn)環(huán)境中推薦使用was實現(xiàn)的數(shù)據(jù)庫連接池。一方面是因為連接池實現(xiàn)地比較完善。另一方面,使用was提供的數(shù)據(jù)庫連接池可以很完善地支持jta事務(wù)。 使用was的jta web應(yīng)用程序在使用事務(wù)的時候常常會涉及一個事務(wù)類型的選擇。是選擇像jdbc事務(wù)這樣的本地事務(wù)呢還是使用jta支持的全局事務(wù)。這個與應(yīng)用程序需要涉及到的事務(wù)管理器類型和個數(shù)密切相關(guān)。spring本身不支持分布式事務(wù),因此分布式事務(wù)需要底層的jta。但是spring提供了事務(wù)的抽象,即底層真正事務(wù)實現(xiàn)可以切換而不影響應(yīng)用程序代碼。這樣應(yīng)用程序可以依賴于底層was,也可以輕易地脫離開應(yīng)用服務(wù)器的環(huán)境。這一點與前面數(shù)據(jù)源的抽象非常類似。 was本身對于事務(wù)劃分有兩種支持方式,一種是聲明式的,當(dāng)然這種管理方式需要ejb容器的支持,即所謂的容器管理事務(wù)(cmt)。另外一種方式是編程式的,通過程序代碼來直接使用jta編程接口。spring對于事務(wù)的劃分也可以分為聲明式和編程式兩種方式。對于spring編程式的事務(wù)劃分方式,總體上可以分為兩大類。一類是通過直接使用實現(xiàn)platformtransactionmanager接口的類。另一類是通過使用transactiontemplate模板類,模板類的使用可以簡化事務(wù)控制代碼。spring對于聲明式事務(wù)劃分的支持實際上是利用了它的aop機(jī)制。相對于編程式事務(wù)劃分,這種基于aop的方式比較靈活,而且對代碼的侵入性幾乎為零。因此,如果沒有特殊需要推薦使用這種事務(wù)劃分方式;赼op的常用事務(wù)劃分方式可以使用proxyfactorybean加transactioninterceptor方式,或者使用transactionporxyfactorybean的方式。前一種方式相對比較靈活,而后一種則對使用相對比較簡單。 無論是哪一種事務(wù)劃分方式,底層都需要一個事務(wù)管理機(jī)制作為支撐。如果是單一的事務(wù)資源管理器,那么根據(jù)所使用的后臺事務(wù)管理資源不同的類型,可以選擇的platformtransactionmanager實現(xiàn)有datasourcetransactionmanager,hibernatetransactionmanager, jdotransactionmanager, persistencebrokertransactionmanager,和jmstransactionmanager等。無論是單個還是多個事務(wù)資源管理器,都可以使用jtatransactionmanager類。如果使用jtatransactionmanager,那么所有事務(wù)管理實際都會委托給底層應(yīng)用服務(wù)器的jta實現(xiàn)。 例如,如果使用jdbc或ibatis,那么我們可以使用簡單的datasourcetransactionmanager,外部配置文件片斷如下:
如果使用hibernate,那么我們可以使用hibernatetransactionmanager,外部配置文件片斷如下:
使用was的jta支持,我們只需要把上述對應(yīng)bean中的class屬性改成class屬性改為org.springframework.transaction.jta.jtatransactionmanager,然后再把屬性改為websphere對應(yīng)的transactionmanager,參考如下:
通過采用spring的事務(wù)支持,底層事務(wù)采用何種方式的決定就不必在一開始開發(fā)就做出決定。因為我們能夠通過spring的外部配置文件來進(jìn)行切換真正的事務(wù)支持。不過,雖然也有第三方的jta支持,但是was能夠提供非常穩(wěn)定的xa支持,因此推薦使用was的jta,尤其是當(dāng)應(yīng)用涉及到分布事務(wù)處理的時候。這樣無論應(yīng)用涉及幾個事務(wù)資源都可以統(tǒng)一解決。 如何加載spring的jar包 spring框架的核心jar包是spring.jar,但是根據(jù)實際使用情況需要一些擴(kuò)展jar包和依賴jar包。那在was中如何處理這些jar包文件呢?在web應(yīng)用中一個簡單而直接的處理方式放是把這些使用到的jar文件都拷貝到對應(yīng)的web-inf/lib目錄下面。這種方法雖然簡單,但是當(dāng)有多個spring應(yīng)用程序的時候這種處理方式就需要在每個應(yīng)用的web-inf/lib目錄下都拷貝一份相同的jar文件。這里可以通過共享庫的方式來統(tǒng)一解決類庫共享這個問題。