`

spring+jotm+jta+xapool+hibernate+oracle架构中多数据源出现的问题

 
阅读更多

公司一系统使用了spring+jotm+jta+xapool+hibernate+oracle架构,系统出现了500错误,错误信息如下:

 

 

java.sql.SQLException: SQLException in StandardPoolDataSource:getConnection
exception: java.sql.SQLException: Cannot get connection for URL jdbc:oracle:thin:@10.4.1.110:1521:testdb
: 调用中无效的参数
	at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:218)
	at org.enhydra.jdbc.pool.StandardPoolDataSource.getConnection(StandardPoolDataSource.java:168)
	at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:133)


……
 

 

 

其中数据源配置的部分bean如下(网上找的示例,和我的格式一样):

 

 

<bean id="dataSource_stat" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
  <property name="dataSource">
	   <bean id="innerDataSource" 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="minCon" value="1">
	 </bean>
  </property>
  <property name="user">
		<value>t_wms</value>
  </property>
  <property name="password">
		<value>111</value>
  </property>
 </bean>
 
 <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBea n"/>
 <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransaction Manager">
	<property name="userTransaction"><ref local="jotm"/></property>
 </bean>
   

    错误比较奇怪的地方在于:

 

 

1.部分模块出现该错误,部分模块不会出现。
2.出现该错误的模块,有时候会正常,有时候会出现上述错误。
3.出现错误的模块中,使用级联操作的页面出现的概率高,查询单独表的页面出现错误的概率小。

 

 

1.排查问题的过程中,首先排除了代码问题,原因是系统部署使用另外获取数据源的方式,如,把数据源配置在resion中,是不会出现该问题的。
2.怀疑是jar包冲突的问题。在排查过程中,发现数据库连接的jar包之间没有问题,与数据源配置在resion中系统的lib包中数据连接的jar包是一样的,包括ssh的包。
3.怀疑是xa事务控制的问题。

 

   在调查xapool的问题时,发现也有coder也出现了类似的问题,不过时间比较早。毕竟xapool 1.5版本是2005年发布的,2006年发布了1.6beat版本后就没再更新过。

 

 

主要解决方案有

 

方案1.

 

   如果是使用的1.5版本的

 

   Oracle9i有名的内存溢出bug导致:Xapool对PreparedStatement进行了Cache,同时Oracle有一个出名的内存漏洞,PreparedStatement使用之后必须关闭,如果不关闭连续进行SQL查询会造成前面SQL的游标不能释放;
   Xapool1.5的修改如下:
修改StandardConnectionPoolDataSource类的public static final int DEFAULT_PREPAREDSTMTCACHESIZE = 0,(当然也可以用配置的方式来注入)
这样就关闭了PreparedStatement的Cache,而且也不会造成什么1.4中关闭连接时的异常等等.

    或者:

下载xapool源码包,然后在org.enhydra.jdbc.pool.GenericPool中,找到life = (Long) unlocked.get(o); 代码
之后在下面加入:


if (life == null)  continue;  

 

 

   建议使用1.6版本的吧,毕竟自己需要查看源代码和修改,如果不慎可能造成不可预知的后果。

 

方案2.可以把数据源修改为

 

<bean id="dataSource_stat" 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>
	  <property name="user">
			<value>t_wms</value>
	  </property>
	  <property name="password">
			<value>111</value>
	  </property>
	  <property name="minCon" value="1">
 </bean>
 

    这个方案是自己测试发现的,可以使用,但是貌似没有走数据连接池。

 

  方案3.

     数据连接池中数据源中都配置用户名和密码,即StandardXAPoolDataSource中要配置user和password,StandardXADataSource中也要配置user和password如:

 

 <bean id="dataSourcePool" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
  <property name="dataSource">
	   <bean id="innerDataSource" 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>
		  <property name="minCon" value="1">
	 </bean>
  </property>
  <property name="user">
		<value>t_wms</value>
  </property>
  <property name="password">
		<value>111</value>
  </property>
 </bean>

 

  这个问题挺奇怪的,如果有朋友有其他好的解决方案,欢迎交流~~

 

参考地址:http://www.blogjava.net/hunteva/archive/2009/01/20/62936.html

               http://forum.springsource.org/archive/index.php/t-28145.html

               http://fableking.iteye.com/blog/954153

0
0
分享到:
评论

相关推荐

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    1.多数据源配置,采用方式:直接配置两个不同的数据源,不同的sessionFactory。 2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元...

    Spring+iBatis+JOTM实现JTA事务

    在分布式系统中,JTA(Java Transaction API)事务管理用于处理跨越多个数据源的事务,如数据库、消息队列等。JOTM(Java Open Transaction Manager)是一个开源的JTA事务管理器,可以在非J2EE环境下提供分布式事务...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    Java分布式开发spring+jta+jotm

    "Java分布式开发spring+jta+jotm"的主题涵盖了Spring框架在分布式系统中的应用,特别是如何利用JTA和JOTM来处理跨资源的分布式事务。理解和掌握这些技术对于构建可扩展、健壮的Java应用至关重要。通过深入学习和实践...

    spring+jotm 多数据源事务管理(二)hibernate

    本篇文章将聚焦于如何结合Spring和JOTM(Java Open Transaction Manager)来实现多数据源的事务管理,特别是针对使用Hibernate的情况。 JOTM是Java平台上的一个开放源代码事务管理器,它遵循JTA(Java Transaction ...

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    spring+jotm 多数据源事务管理(三)JNDI+Tomcat

    在本篇文章中,我们将深入探讨如何利用Spring框架结合JOTM(Java Open Transaction Manager)来实现多数据源下的分布式事务管理。我们将通过具体实例展示如何在Tomcat服务器环境下配置并使用这些技术。 #### 一、...

    spring + JTA + JOTM实现分布式事务

    分布式事务是现代企业级应用中不可或缺的一部分,尤其是在大数据和微服务架构中,它确保了在多个数据库或资源管理系统中的数据一致性。本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java ...

    Spring+JOTM 分布式事务管理

    - **恢复能力**:JOTM具有事务恢复功能,能够处理事务在进行中的系统崩溃或网络问题。 - **性能优化**:JOTM设计上考虑了性能,比如批处理支持和缓存策略,以减少系统开销。 - **兼容性**:JOTM支持各种JCA 1.5...

    hibernate+tomca5.5t+JOTM 2.10 JTA配置

    在Hibernate的配置文件`hibernate.cfg.xml`中,指定使用JTA事务管理器,例如`&lt;property name="jta.platform"&gt;org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform&lt;/property&gt;`,并配置数据源为...

    多数据源 更新 spring jta java jotm

    总结来说,Spring、JTA和JOTM的组合提供了在多数据源环境中高效且可靠的事务处理能力。通过Spring的`AbstractRoutingDataSource`和JTA,我们可以轻松地管理多个数据源,并通过JOTM保证分布式事务的一致性。在实际...

    spring 3.0.5 + jotm 实现的的spring mvc 的例子

    在Spring中,通过集成JOTM,可以实现全局的事务控制,确保在多资源操作中保持数据的一致性。 **集成步骤**: 1. **添加依赖**:首先,项目需要在构建配置(如pom.xml或build.gradle)中引入Spring 3.0.5和JOTM的...

    spring JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    3. **Spring配置**:在Spring的配置文件中,使用`jee:jta-data-source`或`jee:resource-ref`元素来引用之前创建的JNDI数据源,并配置`PlatformTransactionManager`为`org.objectweb.jotm.CurrentJOTM`。 **Atomikos...

    在Spring中使用JTA事务管理

    这在处理分布式系统或多数据源的应用中至关重要,因为它确保了即使在异常情况下,数据也能保持一致性和完整性。在实际应用中,你可能还需要考虑事务隔离级别、事务超时和其他事务属性的调整,以满足特定业务需求。

    spring-hibernate-jotm 例子

    在Spring中,JOTM可以作为全局事务管理器,处理跨越不同数据源的事务。当应用程序需要在多个数据库或者服务之间进行事务操作时,JOTM能够确保所有操作要么全部成功,要么全部失败,实现ACID(原子性、一致性、隔离性...

Global site tag (gtag.js) - Google Analytics