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 阅读(7137) | 评论 (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 阅读(5889) | 评论 (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 阅读(424) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3