Habitat Framework

          專注于Java EE企業級開發
          posts - 13, comments - 81, trackbacks - 0, articles - 5
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          因為在項目中要用到多數據源,所以這次必須采用JTA這種分布式事務管理方案,后來決定選JOTM這個JTA的開源實現,網上關于JOTM的文章很多了,就不贅述了,貼下我的配置吧(carol.properties就免了吧):

          <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
           <!--JOTM-->
           <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
              <property name="userTransaction">
                  <ref local="jotm"/>
              </property>
           </bean>
            
           <bean id="abstractTransactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager">
             <ref bean="transactionManager"/>
            </property>
            <property name="transactionAttributeSource">
             <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
            </property>
           </bean>

           <bean id="abstractTmsSessionProxy" abstract="true">
            <property name="sessionFactory" ref="tmsSessionFactory"/>
           </bean>
           
           <bean id="abstractWmsSessionProxy" abstract="true">
            <property name="sessionFactory" ref="wmsSessionFactory"/>
           </bean>
           
           <bean id="abstractFmsSessionProxy" abstract="true">
            <property name="sessionFactory" ref="fmsSessionFactory"/>
           </bean>
           


           <!-- WMS data source -->
           <bean id="innerDataSourceWms" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
            <property name="transactionManager">
             <ref local="jotm"/>
            </property>
            <property name="driverName">
             <value>oracle.jdbc.OracleDriver</value>
            </property>
            <property name="url">
             <value>jdbc:oracle:thin:@10.4.1.110:1521:testdb</value>
            </property>
            <property name="user">
             <value>t_wms</value>
            </property>
            <property name="password">
             <value>111</value>
            </property>
           </bean>

           <bean id="dataSourceWms" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
            <property name="dataSource">
             <ref local="innerDataSourceWms"/>
            </property>
            <property name="transactionManager">
             <ref local="jotm"/>
            </property>
            <property name="maxSize">
             <value>10</value>
            </property>
            <property name="user">
             <value>t_wms</value>
            </property>
            <property name="password">
             <value>111</value>
            </property>
           </bean>
           
              <bean id="wmsSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
                  <property name="dataSource" ref="dataSourceWms"/>
                  <property name="lobHandler" ref="lobHandler"/>
                  <property name="mappingResources">
                      <list>
                              ........

                      </list>
                  </property>
                  <property name="hibernateProperties">
                      <props>
                          <prop key="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop>
                          <prop key="hibernate.hbm2ddl.auto">update</prop>
                      </props>
                  </property>
            <property name="jtaTransactionManager">
             <ref bean="jotm"/>
            </property>
              </bean>
           
           <!--TMS data source-->
           <bean id="innerDataSourceTms" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
            <property name="transactionManager">
             <ref local="jotm"/>
            </property>
            <property name="driverName">
             <value>oracle.jdbc.OracleDriver</value>
            </property>
            <property name="url">
             <value>jdbc:oracle:thin:@10.4.1.110:1521:testdb</value>
            </property>
            <property name="user">
             <value>t_tms</value>
            </property>
            <property name="password">
             <value>111</value>
            </property>
           </bean>

           <bean id="dataSourceTms" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
            <property name="dataSource">
             <ref local="innerDataSourceTms"/>
            </property>
            <property name="transactionManager">
             <ref local="jotm"/>
            </property>
            <property name="maxSize">
             <value>10</value>
            </property>
            <property name="user">
             <value>t_tms</value>
            </property>
            <property name="password">
             <value>111</value>
            </property>
           </bean>


              <bean id="tmsSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
                  <property name="dataSource" ref="dataSourceTms"/>
                  <property name="lobHandler" ref="lobHandler"/>
                  <property name="mappingResources">
                      <list>
                            ....
                      </list>
                  </property>
                  <property name="hibernateProperties">
                      <props>
                          <prop key="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop>
                          <prop key="hibernate.hbm2ddl.auto">update</prop>
                      </props>
                  </property>
            <property name="jtaTransactionManager">
             <ref bean="jotm"/>
            </property>
              </bean>
           
           
           <!--FMS data source-->
           <bean id="innerDataSourceFms" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
            <property name="transactionManager">
             <ref local="jotm"/>
            </property>
            <property name="driverName">
             <value>oracle.jdbc.OracleDriver</value>
            </property>
            <property name="url">
             <value>jdbc:oracle:thin:@10.4.1.110:1521:testdb</value>
            </property>
            <property name="user">
             <value>t_fms</value>
            </property>
            <property name="password">
             <value>111</value>
            </property>
           </bean>

           <bean id="dataSourceFms" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
            <property name="dataSource">
             <ref local="innerDataSourceFms"/>
            </property>
            <property name="transactionManager">
             <ref local="jotm"/>
            </property>
            <property name="maxSize">
             <value>10</value>
            </property>
            <property name="user">
             <value>t_fms</value>
            </property>
            <property name="password">
             <value>111</value>
            </property>
           </bean>

              <bean id="fmsSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
                  <property name="dataSource" ref="dataSourceFms"/>
            <property name="lobHandler" ref="lobHandler"/>
                  <property name="mappingResources">
                      <list>
                            .....
                      </list>
                  </property>
                  <property name="hibernateProperties">
                      <props>
                          <prop key="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop>
              <prop key="hibernate.hbm2ddl.auto">update</prop>
                      </props>
                  </property>
            <property name="jtaTransactionManager">
             <ref bean="jotm"/>
            </property>
              </bean>

          由于前期使用中的發現XAPool這個包里面有類老是報連接方面的錯誤,于是在參考了一篇網上的文章后把xapool和包裝連接的配置都去掉了,結果導致的是多數據源的事務根本無法實現,后來仔細想想,覺得很詭異,xapool就是jotm實現多數據源事務的關鍵所在,怎么能不用?

          于是仔細研究了下,發現很多問題,首先,JOTM需要的依賴--CAROL包沒有JDK1.5的版本,需要自己下載源碼并編譯成新的ow_carol-all.jar
          Xapool倒是有JDK1.5的版本xapool-1.5.0,但是跑起來老是報錯,于是去下了xapool的源文件,發現居然源碼都不能編譯通過,還有JDK1.5的保留字在里面,真不知道作者是怎么發布出1.5.0的.于是自己改掉關鍵字,并修補了一些檢查不太嚴格的檢測,并重新打了個版本.結果跑起來還是會報錯,不過是oracle報游標用盡的錯誤.

          搜了一把就發現原來是Oracle9i有名的內存溢出bug導致:Xapool對PreparedStatement進行了Cache,同時Oracle有一個出名的內存漏洞,PreparedStatement使用之后必須關閉,如果不關閉連續進行SQL查詢會造成前面SQL的游標不能釋放;

          參考了網上的修改方案(xapool1.4的),又自己研究了半天,最后終于成功了,Xapool1.5的修改如下:
          修改StandardConnectionPoolDataSource類的public static final int DEFAULT_PREPAREDSTMTCACHESIZE = 0,(當然也可以用配置的方式來注入)
          這樣就關閉了PreparedStatement的Cache,而且也不會造成什么1.4中關閉連接時的異常等等.

          最后根據實際情況,設置好dataSourceXXX這幾個bean的lifeTime,sleepTime,maxSize,checkLevelObject屬性(具體意義和設置方法可以參考網上的說明)
          就終于可以正式使用了,測試了下,情況還不錯:)


          最近有很多朋友都說他們配置不成功,可能是某些細節造成的吧,因為這套系統現在正在TCL總部順利的運轉著,所有我相信這個方法還是可行的,如果大家有什么問題需要我幫助,我很樂意幫忙,有人說要我自己改的xapool1.5,因為再我改好后不久,1.6就已經發布了,所有我就沒有貼出來了,有問題的朋友可以直接留言我你的msn,我會加你的.

          posted @ 2006-08-11 18:03 Kerwin Weng 閱讀(7161) | 評論 (29)編輯 收藏

          Spring或Hibernate其實都提供了透明處理Clob的方法
          只是個人覺得用Spring的做法比hibernate更透明一點(hibernate2.16);
          具體做法為:
          1.在sessionFactory中加入lobHandler的注射:

          <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
          ??????? <property name="dataSource" ref="dataSource"/>
          ????????<property name="lobHandler" ref="lobHandler"/>
          ??????? <property name="mappingResources">
          ??????????????????<value>xxx.hbm.xml</value>
          ??????????????????.....
          ?????????</property>
          </bean>

          2.定義這個lobHandler,值得注意的是這里有Oracle的版本區別:

          <bean id="lobHandler" lazy-init="true"?? class="org.springframework.jdbc.support.lob.OracleLobHandler">
          ??????? <property name="nativeJdbcExtractor">
          ??????????? <ref bean="nativeJdbcExtractor"/>
          ??????? </property>
          </bean>

          <bean id="nativeJdbcExtractor" lazy-init="true"?? class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>

          因為Oracle9i處理Clob的方式和別的數據庫很不一樣,甚至與Oracle10g都不兼容,所以這里要用spring提供的SimpleNativeJdbcExtractor.如果使用Oracle10g的話,可以直接使用:

          <bean id="lobHandler" lazy-init="true"? class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>

          對應的應該使用Oracle10g對應的JDBC驅動.

          4.在領域對象的hbm中對應的Clob字段應該使用這樣的定義:

          <property name="context" column="context" type="org.springframework.orm.hibernate.support.ClobStringType" length="1048576000"/>

          這里的length是字節了,不是長度哦,最大可以設到2G.對應的,該字段在領域對象中直接申明成String就可以了.當對這個字段寫入長數據時直接調用其set方法就可以了,Spring會自己幫你做余下的處理,讓你透明的處理Clob字段.

          5.業務邏輯層對該字段的操作必須需要在有事務管理的方法中使用,否則會報:
          java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required 這個錯誤

          posted @ 2006-04-08 18:48 Kerwin Weng 閱讀(5911) | 評論 (17)編輯 收藏

          [整合]在RedhatAS4.0環境下利用mod_ajp整合apache-2.2.0和tomcat-5.5.12

          今天偶然在網上發現apache-2.2.0增加了一個proxy-ajp模塊,看了看它可以完全代替原來的mod-jk把tomcat和apache結合到一起。于是我就下載下來試了一下真的很方便比原來的方法簡單多了。下面就說明一下我的安裝步驟。tomcat和jdk的安裝網上太多的教程我在這里就不再介紹了。大家可以去查看其他的教程。

          首先從[url]http://www.apache.org[/url]的網站上下載apache-2.2.0的源代碼。apache-2.2.0的版本做了些改動大家需要注意一下。首先apr和apr-util需要單獨的安裝,還有配置文件由原來的一個變為現在的多個不過這樣也好,可以清楚的知道那部分配置在那個配置文件里方便修改。安裝步驟如下:

          解壓apache的源代碼
          # tar xvjf httpd-2.2.0.tar.bz2
          # cd httpd-2.2.0

          安裝apr
          # cd srclib/apr
          # ./configure --prefix=/server/soft/apr
          # make
          # make install

          安裝apr-util
          # cd ../apr-util/
          # ./configure --prefix=/server/soft/apr-util --with-apr=/server/soft/apr
          # make
          # make install
          # cd ../../

          安裝apache
          # ./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite=share    --enable-proxy=share --enable-proxy-ajp=share --enable-dav=share --with-apr=/server/soft/apr --with-apr-util=/server/soft/apr-util/
          # make
          # make install

          # /server/soft/apache/bin/httpd -l //看看是否有proxy-ajp這個模塊
          如果有這個模塊證明proxy-ajp模塊安裝成功,可以進行與tomcat的結合了。

          # vi /server/soft/apache/conf/httpd.conf
          把"#Include conf/extra/httpd-vhosts.conf" 前面的"#"去掉然后編輯
          /server/soft/apache/conf/extra/httpd-vhosts.conf

          編輯為如下的代碼
          <VirtualHost *:80>
              ServerAdmin [email]admin@easyea.com[/email]
              ProxyPass / ajp://localhost:8009/
              ProxyPassReverse / ajp://localhost:8009/
              ServerName localhost
              ServerAlias [url]www.easyea.com[/url]
              ErrorLog logs/easyea.com-error_log
              CustomLog logs/easyea.com-access_log common
          </VirtualHost>

          然后先啟動tomcat,再啟動apache
          # /server/soft/apache/bin/apachctl start
          打開瀏覽器看看是否看到了tomcat的歡迎頁面,如果是說明apache和tomcat的結合成功

          轉自[url=http://blog.easyea.com/louis/2005/12/17/86.htm]http://blog.easyea.com/louis/2005/12/17/86.htm[/url]

          posted @ 2006-03-05 20:16 Kerwin Weng 閱讀(449) | 評論 (0)編輯 收藏

          僅列出標題
          共3頁: 上一頁 1 2 3 
          主站蜘蛛池模板: 右玉县| 万载县| 齐齐哈尔市| 雷州市| 佛学| 保德县| 衡水市| 文水县| 隆林| 香格里拉县| 屯留县| 额敏县| 赤水市| 东阿县| 彭水| 永丰县| 永德县| 高碑店市| 荥经县| 黔东| 湘乡市| 泾阳县| 榆社县| 亳州市| 凤凰县| 古浪县| 平定县| 和林格尔县| 弥勒县| 万山特区| 措美县| 黔东| 布拖县| 通江县| 保山市| 丹江口市| 攀枝花市| 东阿县| 同心县| 雷州市| 竹北市|