沙漠中的魚

          欲上天堂,先下地獄
          posts - 0, comments - 56, trackbacks - 0, articles - 119
            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          Spring與WebSphere應用服務器的配合

          Posted on 2008-04-19 22:35 沙漠中的魚 閱讀(634) 評論(0)  編輯  收藏 所屬分類: 開源框架
          Spring與底層J2EE應用服務器還是存在一些需要結合的地方,這里給出WAS中的一些結合點。

            1 使用WAS數據源

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

            Spring提供了一個DriverManagerDataSource類來統一第一種方式的數據源獲取。如果使用WAS中的Cloudscape數據庫,用外部配置文件可配置如下:
          <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName">
          <value>com.ibm.db2j.jdbc.DB2jDriver</value>
          </property>
          <property name="url">
          <value>jdbc:db2j:D:\\DBName</value>
          </property>
          </bean>


                  Spring提供了JndiObjectFactoryBean類來支持第二種方式的數據源獲取。假設WAS中已經配置好的數據源名稱為jdbc /MyDB,那么用外部配置文件可配置如下:

          <bean id="dataSource"
          class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName"><value>java:comp/env/jdbc/MyDB</value></property>
          </bean>

          或者

          <bean id="dataSource"
          class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName"><value>jdbc/MyDB</value></property>
          <property name="resourceRef"><value>true</value></property>
          </bean>

          從上面配置我們可以得知,通過使用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,外部配置文件片斷如下:

          <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource">
          <ref local="dataSource" />
          </property>
          </bean>

          如果使用Hibernate,那么我們可以使用HibernateTransactionManager,外部配置文件片斷如下:

          <bean id="transactionManager" class="org.springframework.orm.hibernate.
          HibernateTransactionManager">
          <property name="sessionFactory"><ref local="sessionFactory"/></property>
          </bean>

          使用WAS的JTA支持,我們只需要把上述對應bean中的class屬性改成class屬性改為org.springframework.transaction.jta.JtaTransactionManager,然后再把屬性改為WebSphere對應的TransactionManager,參考如下:

          <bean id="wasTxMgr"
          class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/>
          <bean id="transactionManager"
          class="org.springframework.transaction.jta.JtaTransactionManager">
          <property name="transactionManager">
          <ref local="wasTxMgr"/>
          </property>
          </bean>

          通過采用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

          主站蜘蛛池模板: 高邑县| 图片| 南充市| 西丰县| 镇原县| 儋州市| 陆良县| 浮山县| 岑巩县| 墨玉县| 闸北区| 绥中县| 桦川县| 衡水市| 西藏| 平塘县| 江永县| 黑山县| 梨树县| 阳原县| 峨边| 南阳市| 克山县| 榆中县| 上饶县| 和政县| 新邵县| 灵石县| 赤壁市| 肥东县| 灵寿县| 泰顺县| 陆丰市| 潞城市| 临安市| 昌乐县| 荣成市| 武宣县| 和田市| 白朗县| 稻城县|