kingpub

海内存知己,博客若比邻

 

使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇

因为在项目中要用到多数据源,所以这次必须采用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属性(具体意义和设置方法可以参考网上的说明)
就终于可以正式使用了,测试了下,情况还不错:)

posted on 2006-08-15 09:44 xiaofeng 阅读(354) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜