基於Spring框架的WebSphere套用開發3

  spring與websphere套用伺服器的配合 spring與底層j2ee套用伺服器還是存在一些需要結合的地方,這裡給出was中的一些結合點。

使用was數據源

在java應用程式中,資料庫的連線一般有兩種方式來得到。一種是通過java.sql.drivermanager的方式來得到資料庫連線。這種方式不依賴於套用服務的支持,但是也不提供資料庫連線池的功能。另外一種方式是通過javax.sql.datasource的方式來得到資料庫連線。在傳統基於j2ee的套用需要通過jndi來得到數據源(javax.sql.datasource)對象,然後再通過數據源來得到相應的資料庫連線。常見的套用伺服器都支持這種方式,且一般都提供了資料庫連線池的支持。雖然說我們一般推薦使用資料庫連線池,但是也有一些時候我們需要脫離開套用伺服器的環境使用資料庫(比如單元測試,比如套用移植等)。然而應用程式使用這兩種方式的時候代碼是不一樣的,因此只能通過代碼來應變。spring提供了一個統一使用數據源的解決方案,然後通過控制反轉的機制用外部配置檔案來指定使用的數據源。這樣一方面可以統一這兩種得到資料庫連線的方式,另一方面也不需要像通常的j2ee套用通過繁瑣的jndi代碼來得到數據源。這樣應用程式也就不需要知道使用的何種數據源。

spring提供了一個drivermanagerdatasource類來統一第一種方式的數據源獲取。如果使用was中的cloudscape資料庫,用外部配置檔案可配置如下:

com.ibm.db2j.jdbc.db2jdriver jdbc:db2j:d:\\dbname
spring提供了jndiobjectfactorybean類來支持第二種方式的數據源獲取。假設was中已經配置好的數據源名稱為jdbc /mydb,那么用外部配置檔案可配置如下:

java:comp/env/jdbc/mydb 或者 jdbc/mydb true
從上面配置我們可以得知,通過使用spring,應用程式能夠統一使用不同的數據源實現。如果使用環境發生變化,那么只需要修改spring的配置檔案即可。對於部署在was上的web套用,在生產環境中推薦使用was實現的資料庫連線池。一方面是因為連線池實現地比較完善。另一方面,使用was提供的資料庫連線池可以很完善地支持jta事務。 使用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,尤其是當套用涉及到分布事務處理的時候。這樣無論套用涉及幾個事務資源都可以統一解決。 如何載入spring的jar包

spring框架的核心jar包是spring.jar,但是根據實際使用情況需要一些擴展jar包和依賴jar包。那在was中如何處理這些jar包檔案呢?在web套用中一個簡單而直接的處理方式放是把這些使用到的jar檔案都拷貝到對應的web-inf/lib目錄下面。這種方法雖然簡單,但是當有多個spring應用程式的時候這種處理方式就需要在每個套用的web-inf/lib目錄下都拷貝一份相同的jar檔案。這裡可以通過共享庫的方式來統一解決類庫共享這個問題。