<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    沙漠中的魚

    欲上天堂,先下地獄
    posts - 0, comments - 56, trackbacks - 0, articles - 119
      BlogJava :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理
    Spring與底層J2EE應(yīng)用服務(wù)器還是存在一些需要結(jié)合的地方,這里給出WAS中的一些結(jié)合點(diǎn)。

      1 使用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)對(duì)象,然后再通過數(shù)據(jù)源來得到相應(yīng)的數(shù)據(jù)庫連接。常見的應(yīng)用服務(wù)器都支持這種方式,且一般都提供了數(shù)據(jù)庫連接池的支持。雖然說我們一般推薦使用數(shù)據(jù)庫連接池,但是也有一些時(shí)候我們需要脫離開應(yīng)用服務(wù)器的環(huán)境使用數(shù)據(jù)庫(比如單元測(cè)試,比如應(yīng)用移植等)。然而應(yīng)用程序使用這兩種方式的時(shí)候代碼是不一樣的,因此只能通過代碼來應(yīng)變。Spring提供了一個(gè)統(tǒng)一使用數(shù)據(jù)源的解決方案,然后通過控制反轉(zhuǎn)的機(jī)制用外部配置文件來指定使用的數(shù)據(jù)源。這樣一方面可以統(tǒng)一這兩種得到數(shù)據(jù)庫連接的方式,另一方面也不需要像通常的J2EE應(yīng)用通過繁瑣的JNDI代碼來得到數(shù)據(jù)源。這樣應(yīng)用程序也就不需要知道使用的何種數(shù)據(jù)源。

      Spring提供了一個(gè)DriverManagerDataSource類來統(tǒng)一第一種方式的數(shù)據(jù)源獲取。如果使用WAS中的Cloudscape數(shù)據(jù)庫,用外部配置文件可配置如下:
    <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類來支持第二種方式的數(shù)據(jù)源獲取。假設(shè)WAS中已經(jīng)配置好的數(shù)據(jù)源名稱為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,應(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,外部配置文件片斷如下:

    <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支持,我們只需要把上述對(duì)應(yīng)bean中的class屬性改成class屬性改為org.springframework.transaction.jta.JtaTransactionManager,然后再把屬性改為WebSphere對(duì)應(yīng)的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的事務(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

    主站蜘蛛池模板: 免费人成在线观看播放国产| 国产精品亚洲综合专区片高清久久久| 无码的免费不卡毛片视频| 久久亚洲AV成人无码国产| 亚洲AV无码专区日韩| 成年女人毛片免费视频| 中文字幕亚洲免费无线观看日本 | 222www在线观看免费| 特级aaaaaaaaa毛片免费视频| 亚洲午夜久久久久久尤物| 久久久亚洲欧洲日产国码农村| 亚洲熟女乱综合一区二区| 国产又大又粗又硬又长免费| 24小时免费直播在线观看| 国产日本一线在线观看免费| 少妇人妻偷人精品免费视频| 天黑黑影院在线观看视频高清免费| 美女被免费网站视频在线| 亚洲AV日韩AV一区二区三曲| 亚洲精品美女网站| 亚洲一区二区三区深夜天堂 | 亚洲视频免费一区| 香港a毛片免费观看| 今天免费中文字幕视频| 中文字幕一区二区三区免费视频| 美国免费高清一级毛片| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 日韩内射激情视频在线播放免费| 中国极品美軳免费观看| 亚洲精品黄色视频在线观看免费资源| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲啪啪AV无码片| 亚洲综合AV在线在线播放| 4338×亚洲全国最大色成网站| 免费少妇a级毛片| 免费大学生国产在线观看p| 免费久久精品国产片香蕉| 亚洲国产一区明星换脸| 亚洲另类少妇17p| 亚洲综合在线另类色区奇米| 国产亚洲A∨片在线观看|