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,我会加你的.


评论

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-03-26 22:50 by goldpigbaby
老大:
我用mssql5.1+oracle10g,oracle可以实现事务控制但是mysql就是不行,不知试过mysql没有?

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-03-26 23:48 by hunteva
试过啊,

mysql安装的时候可以选择使用事务支持或非事务性数据库的

确定你安装的是带事务支持的吗?

不成功的原因可能有很多,多检查下,或提供你的详细信息

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-04-09 22:59 by goldpigbaby
我本想把我的application_context.xml给贴上来,但是太多贴不上。我留下msn希望向你请叫一下,我的msn:anttree911@hotmail.com

# 5555555555555  回复  更多评论   

2007-08-02 00:13 by 看了很多也不知道怎么做啊!
看来你是可以啊。....希望能得到你的帮助啊!
我的msn是gmm2003_csdn@hotmail.com
十分感谢啊!已经一周了啊都没有解决啊

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-09-10 10:36 by andyao
你好,我也遇到一楼的问题,mysql 事务不rollback,每次都commit,无论其他的是否成功。能否将你修改的jar文件发一份给我,我试一下

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-09-25 15:34 by divid
求助:
我现在用jotm
spring+hibernate+jotm+sql server2005
现在事务也不能回滚
留下qq:32419852
希望你得到你的帮助.

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇[未登录]  回复  更多评论   

2007-09-27 09:34 by Chen
求助...
我也遇到同样多数据源,需要事务来管理的问题,上面的基本都看懂了......只是具体的程序的写法上出了点问题.....请教......Msn:ak47acao@163.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-09-29 17:14 by Kerwin Weng
@divid
加了你,但是没有让我通过啊@divid

首先确定你的数据库是否支持分布式事务,如Mysql5.0,Connecter/J5.0之前就不支持,如果不支持请看andyao的这篇文章http://www.javaeye.com/post/378945

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-10-18 21:15 by superkid
发现在调用hibernate的dao时,执行完flush(),就提交到数据库中了,全局事务好像没有起到作用.我的msn:zlc702@hotmail.com,谢谢

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2007-11-27 13:27 by niehaomin
niehaomin@hotmail.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-01-05 18:55 by Hannibal
不用jta时单个数据库下mysql可以实现事务,但用jtom+hibernate+spring+mysql不能实现回滚。
jingdi@gmail.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇[未登录]  回复  更多评论   

2008-03-04 14:06 by paul
今天遇到个问题,希望向您请教!我的msn:e3002@163.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-04-02 01:33 by okj
老大你好,我也遇到这个问题,我的数据库全是Oracle10

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-04-02 01:34 by okj
您好我的Email: okj2006@126.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-05-30 15:26 by cmaster
老兄,我正在配这个,把你的carol包和xapool包发一份我吧,我老报找不到jar包的错误,chsboy@hotmail.com谢谢了

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-06-11 15:10 by 刘玉海
老兄!你好啊!我正在用这个jotm啊!遇到了好多问题,还真亏了看了您这片文章啊!不过我还是遇到一个问题啊!我的测试程序就是一个类加载了spring的2个配置文件启动后,执行完成了,可是仍然有线程在运行 ,一直这样不停止,是因为全局事务的原因吗?而且我还遇到个怪问题啊!下面是抛出的异常!
麻烦老兄帮忙看看! 我的MSN:lyhit_830@hotmail.com

谢谢了!

Hibernate: select DOWNLOADRECORDSEQUENCE.nextval from dual
java.sql.SQLException: Cannot get connection for URL
jdbc:oracle:thin:@192.168.100.81:1521:nstldb
: 调用中无效的参数
at org.enhydra.jdbc.standard.StandardDataSource.getConnection(StandardDataSource.java:216)
at org.enhydra.jdbc.standard.StandardXADataSource.getFreeConnection(StandardXADataSource.java:472)
at org.enhydra.jdbc.standard.StandardXAConnection.getConnection(StandardXAConnection.java:138)
at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:209)
at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:164)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.springframework.orm.hibernate3.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:126)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:48)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:835)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:645)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:630)
at com.nstl.metadata.bo.DownloadrecordBO$$EnhancerByCGLIB$$2c29d289.save(<generated>)
at com.nstl.metadata.exportTfo.bo.ExportTfoBO.recordDownloadRecord(ExportTfoBO.java:313)
at com.nstl.metadata.exportTfo.bo.ExportTfoBO.pubTfo(ExportTfoBO.java:273)
at com.nstl.metadata.exportTfo.bo.ExportTfoBO.exportTfoByTableName(ExportTfoBO.java:140)
at com.nstl.metadata.exportTfo.bo.ExportTfoBO.main(ExportTfoBO.java:525)

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-06-11 15:12 by 刘玉海
destroy-method="shutdown" 我的数据源也提示找不到这个属性方法.

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-06-11 15:14 by 刘玉海
class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown" 此处不能配置这个destroy-method 否则报错.

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇[未登录]  回复  更多评论   

2008-06-11 16:33 by Kerwin Weng
抱歉啊,我很久都没有更新了,关于这个错误我之前用的hibernate是没有的,建议你Google一下

Jotm的配置其实是十分麻烦的,我发现在不同的环境下,成功率不会很高,看看以上的留言就知道了-_-!

十分抱歉的是由于我最近一年来的工作主要专注在RoR方面,所以确实对于各位的问题有点力不从心,很多都没有回复

所以,我建议遇到困难的朋友尽量可以看看这里:http://www.javaeye.com/post/378945
andyao提供了更简单可靠的分布式事务保障方式,我个人也觉得比Jotm好,希望大家不妨考虑考虑

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-12-04 15:31 by hqhe_nj
高手,我的错误是这样的:
2008-12-04 13:52:12,165 INFO [org.enhydra.jdbc.xapool] - <GenericPool:cleanUp done min=2 max=50 count=2>
2008-12-04 13:52:26,020 ERROR [org.enhydra.jdbc.xapool] - <StandardXADataSource:getFreeConnection ERROR: Failed while autocommiting a connection: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.>
2008-12-04 13:52:26,048 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - <Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]>
2008-12-04 13:52:26,071 INFO [org.springframework.jdbc.support.SQLErrorCodesFactory] - <SQLErrorCodes loaded: [DB2, Derby, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]>
2008-12-04 13:52:26,075 WARN [org.springframework.jdbc.support.SQLErrorCodesFactory] - <Error while extracting database product name - falling back to empty error codes>
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
Caused by:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
不知道错在哪里,我的MSN:hqhe_nj@hotmail.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇[未登录]  回复  更多评论   

2008-12-04 15:43 by Kerwin Weng
看起来像是连接被提前关闭了,可以检查下数据库端的设置,是否关闭空连接的时间小过xapool为保持空连接而要发起一个查询的间隔时间

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2008-12-22 16:00 by laogao
提交了数据 提示保存成功 ,可是数据库查不到数据,也没报异常,不知道事务是否又提交?

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇[未登录]  回复  更多评论   

2008-12-22 16:15 by Kerwin Weng
可能性太多了,可以通过查询数据库状态来查看是否有事务没有提交,具体方法请Google下

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2009-01-20 11:39 by
能给我发下您改的xapool1.5包么? 我的msn:xgy_accp@hotmail.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2009-12-02 19:11 by 李年丰
我的QQ175353552,能给我发下您改的xapool1.5包么? 感谢大恩大德啊

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2010-02-23 13:55 by joyjiang
能给我发下您改的xapool1.5包么?
我的msn: joy_jiang2000@hotmail.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2011-11-01 18:17 by sscel
大哥:也给我发一份你的lib目录下的jar包,我的邮箱是:1620968451@qq.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2011-12-04 12:51 by kira
最近也在做 jotm,问题一直解不了.也发我一份你的lib目录下的jar包,carol包的源码一直没找到 ..谢谢. email : 763091466@qq.com

# re: 使用Spring+Hibernate+JOTM+Oracle9i集成解决方案的遭遇  回复  更多评论   

2012-04-20 11:19 by xinyu
大哥你好,小弟最近在弄JOTM,同样mysql事务也无效,我的mysql驱动是5.1的,请您也给我发一份lib目录下的jar包吧,谢谢您了,email:39843200@qq.com

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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问