上午把oracle 驱动升级为 ojdbc14-11.2.0后,项目启动时报错:
15:56:00.827 [main] WARN atomikos - ERROR IN RECOVERY com.atomikos.datasource.ResourceException: Error in recovery at com.atomikos.datasource.xa.XATransactionalResource.recover(XATransactionalResource.java:596) at com.atomikos.datasource.xa.XATransactionalResource.endRecovery(XATransactionalResource.java:670) at com.atomikos.icatch.imp.TransactionServiceImp.recover(TransactionServiceImp.java:635) at com.atomikos.datasource.xa.XATransactionalResource.setRecoveryService(XATransactionalResource.java:503) at com.atomikos.icatch.system.Configuration.installRecoveryService(Configuration.java:278) at com.atomikos.icatch.imp.TransactionServiceImp.recover(TransactionServiceImp.java:580) at com.atomikos.icatch.imp.TransactionServiceImp.init(TransactionServiceImp.java:741) at com.atomikos.icatch.imp.BaseTransactionManager.init(BaseTransactionManager.java:217) at com.atomikos.icatch.standalone.StandAloneTransactionManager.init(StandAloneTransactionManager.java:104) at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:307) at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:413) at com.atomikos.icatch.jta.UserTransactionManager.checkSetup(UserTransactionManager.java:90) at com.atomikos.icatch.jta.UserTransactionManager.init(UserTransactionManager.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
解决方式:将之前的AtomikosDataSourceBean配置方式换为AtomikosNonXADataSourceBean方式。
<!-- 配置dataSource数据源 --> <bean id="parentDataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init" destroy-method="close" p:uniqueResourceName="rw1" p:testQuery="select 1 from dual" abstract="true"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" /> <property name="user" value="TEST_RW_1" /> <property name="password" value="TEST_RW_1" /> <property name="poolSize" value="5" /> <property name="maxPoolSize" value="30" /> </bean> <bean id="com.fand.dataSource.rw1" parent="parentDataSource"></bean> <bean id="com.fand.dataSource.rw2" p:uniqueResourceName="rw2" parent="parentDataSource"> <property name="user" value="TEST_RW_2" /> <property name="password" value="TEST_RW_2" /> </bean> <bean id="com.fand.dataSource.rw3" p:uniqueResourceName="rw3" parent="parentDataSource"> <property name="user" value="TEST_RW_3" /> <property name="password" value="TEST_RW_3" /> </bean> <bean id="com.fand.dataSource.rw4" p:uniqueResourceName="rw4" parent="parentDataSource"> <property name="user" value="TEST_RW_4" /> <property name="password" value="TEST_RW_4" /> </bean> <bean id="com.fand.dataSource.r1" p:uniqueResourceName="r1" parent="parentDataSource"> <property name="user" value="TEST_R_1" /> <property name="password" value="TEST_R_1" /> </bean> <bean id="com.fand.dataSource.r2" p:uniqueResourceName="r2" parent="parentDataSource"> <property name="user" value="TEST_R_2" /> <property name="password" value="TEST_R_2" /> </bean> <bean id="com.fand.dataSource.r3" p:uniqueResourceName="r3" parent="parentDataSource"> <property name="user" value="TEST_R_3" /> <property name="password" value="TEST_R_3" /> </bean> <bean id="com.fand.dataSource.r4" p:uniqueResourceName="r4" parent="parentDataSource"> <property name="user" value="TEST_R_4" /> <property name="password" value="TEST_R_4" /> </bean> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"> <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="true" /> </bean> </property> <property name="userTransaction"> <bean class="com.atomikos.icatch.jta.UserTransactionImp" p:transactionTimeout="6000" /> </property> <property name="allowCustomIsolationLevels" value="true" /> </bean> <tx:annotation-driven />
Atomikos数据源配置方法有三种分别:
- SimpleDataSourceBean
- AtomikosDataSourceBean
- AtomikosNonXADataSourceBean
下面的演示以Orcale数据库为例子
- 数据源1:192.168.8.1 sid:orcl 用户名/密码:micmiu/micmiu.com
- 数据源2:192.168.8.2 sid:orcl 用户名/密码:ctosun/ctosun.com
[一]、SimpleDataSourceBean
这个是最简单地数据源配置,需要配置XA驱动。
<!-- 数据源配置 simple 1 --> <bean id="simpleDS1" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <!-- 该值要唯一 --> <value>simpleDS1</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaDataSourceProperties"> <value>URL=jdbc:oracle:thin:@192.168.8.1:1521:orcl;user=micmiu;password=micmiu.com </value> </property> <property name="exclusiveConnectionMode"> <value>true</value> </property> <property name="connectionPoolSize"> <value>3</value> </property> <property name="validatingQuery"> <value>SELECT 1 from dual</value> </property> </bean> <!-- 数据源配置 simple 2 --> <bean id="simpleDS2" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <value>simpleDS2</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaDataSourceProperties"> <value>URL=jdbc:oracle:thin:@192.168.8.2:1521:orcl;user=ctosun;password=ctosun.com </value> </property> <property name="exclusiveConnectionMode"> <value>true</value> </property> <property name="connectionPoolSize"> <value>3</value> </property> <property name="validatingQuery"> <value>SELECT 1 from dual</value> </property> </bean>
[二]、AtomikosDataSourceBean
Atomikos实现的数据源,需要配置XA驱动,推荐此配置,可以配置连接池的信息。
<!-- 数据源配置 Atomikos datasource 1 --> <bean id="atomikosDS1" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <!-- 该值要唯一 --> <value>atomikosDS1</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaProperties"> <props> <prop key="URL">jdbc:oracle:thin:@192.168.8.1:1521:orcl</prop> <prop key="user">micmiu</prop> <prop key="password">micmiu.com</prop> </props> </property> <property name="poolSize"> <value>5</value> </property> <property name="maxPoolSize"> <value>15</value> </property> </bean> <!-- 数据源配置 Atomikos datasource 2 --> <bean id="atomikosDS2" init-method="init" destroy-method="close"> <property name="uniqueResourceName"> <!-- 该值要唯一 --> <value>atomikosDS2</value> </property> <property name="xaDataSourceClassName"> <value>oracle.jdbc.xa.client.OracleXADataSource</value> </property> <property name="xaProperties"> <props> <prop key="URL">jdbc:oracle:thin:@192.168.8.2:1521:orcl</prop> <prop key="user">ctosun</prop> <prop key="password">ctosun.com</prop> </props> </property> <property name="poolSize"> <value>5</value> </property> <property name="maxPoolSize"> <value>15</value> </property> </bean>
[三]、AtomikosNonXADataSourceBean
该数据源配置需要普通JDBC的驱动,可以配置连接池:
<!-- AtomikosNonXA datasource 1 需要普通jdbc驱动 --> <bean id="atomikosNonXADS1"> <property name="uniqueResourceName"> <value>atomikosNonXADS1</value> </property> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:thin:@192.168.8.1:1521:orcl</value> </property> <property name="user"> <value>micmiu</value> </property> <property name="password"> <value>micmiu.com</value> </property> <property name="poolSize"> <value>5</value> </property> <property name="borrowConnectionTimeout"> <value>60</value> </property> </bean> <!-- AtomikosNonXA datasource 2 需要普通jdbc驱动 --> <bean id="atomikosNonXADS2"> <property name="uniqueResourceName"> <value>atomikosNonXADS2</value> </property> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:thin:@192.168.8.2:1521:orcl</value> </property> <property name="user"> <value>ctosun</value> </property> <property name="password"> <value>ctosun.com</value> </property> <property name="poolSize"> <value>5</value> </property> <property name="borrowConnectionTimeout"> <value>60</value> </property> </bean>
相关推荐
5. **JNDI数据源配置**:在某些情况下,Atomikos数据源可能会通过JNDI(Java Naming and Directory Interface)进行查找和注册。这在集群环境中特别有用,因为多个服务器可以共享同一个事务管理器。在Spring中,你...
在多数据源配置中,Druid可以作为一个高效且灵活的工具,帮助管理不同的数据库连接。 Mybatis是一个轻量级的持久层框架,它允许我们通过XML或注解来编写SQL映射文件,从而更直观地控制SQL执行。在多数据源环境中,...
然后使用`@Bean`注解创建DataSource对象,通过属性注入不同的数据源配置。Spring的`AbstractRoutingDataSource`可以帮助我们动态选择数据源,它可以根据预定义的规则(如请求参数、ThreadLocal等)来决定使用哪个...
2. 使用Spring Cloud Config Server:结合配置中心,可以在运行时动态更新数据源配置。当需要切换数据源时,只需要修改配置中心的配置,然后通知服务端刷新配置即可。 在描述中提到的"两条数据源",意味着项目中...
可以使用`@ConfigurationProperties`注解来自定义数据源配置,并通过`@Bean`创建数据源实例。 4. **启用JTA事务管理**:在主配置类上使用`@EnableJtaTransactionManager`注解,启用心跳检测和事务管理。 5. **数据...
SpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatis
SpringBoot+Mybatis+Atomikos+Mysql+Oracle 多数据源分布式事物后台搭建 完整demo包,直接下下来解压,数据库配成自己的库,表自己的表,修改下脚本直接跑,网上大把资料,没一个能直接用的,这里花了点时间稍做...
创建多数据源的配置文件,包括AtomikosDataSourceBean的定义、TransactionManager的配置以及DynamicRoutingDataSource的实现。在业务代码中,通过`@Transactional`注解开启分布式事务,并在必要时使用`ThreadLocal`...
总的来说,Spring 3.0、Hibernate和Atomikos的组合提供了一种强大且灵活的方式来处理多数据源的分布式事务,使开发者能够构建高度可用和可扩展的企业级应用。通过深入理解这些技术的原理和实践,开发者可以更好地...
6. 测试:最后,通过dstest这样的测试用例,验证多数据源配置是否正确,以及事务处理是否符合预期。 这个压缩包"dstest"可能包含了完成上述配置的源代码和测试用例,可以帮助开发者理解并实践多数据源的配置。学习...
在实际项目中,"jpatest"可能是一个包含测试代码的目录或者模块,用于验证多数据源配置和Atomikos事务管理是否正常工作。测试通常会涉及到插入、查询、更新和删除操作,以确保在不同数据源之间的事务处理正确无误。 ...
在 Spring Boot 中集成 Atomikos,开发者需要配置 Atomikos 作为事务管理器,并为每个数据源设置相应的配置。这通常包括指定数据源类型、连接池大小、事务超时时间等。同时,还需要在 Spring Boot 的配置文件...
总的来说,`spring+druid+atomikos`的组合提供了一种强大的分布式事务解决方案,尤其适用于那些需要处理复杂事务逻辑和多数据源切换的应用。但需要注意的是,这种解决方案可能会增加系统的复杂性,因此在实际应用中...
2. **配置数据源**:在Spring Boot的配置文件`application.properties`或`application.yml`中,为每个数据源定义不同的数据源配置,例如`ds1`和`ds2`。 3. **配置Atomikos事务管理器**:在Spring Boot的配置类中,...
5. 配置MyBatis:配置MyBatis的SqlSessionFactory,使用Atomikos数据源,并在Mapper配置中启用事务。 6. 业务代码:在服务层方法上添加@Transactional注解,声明事务边界。 通过上述配置,Spring、MyBatis和...
Atomikos是一个开源的事务管理器,专门用于处理分布式事务,它在Spring多数据源配置中扮演着重要的角色。 Atomikos是JTA(Java Transaction API)的实现,遵循X/Open XA规范,可以提供强一致性的分布式事务处理能力...
1. **初始化**: 应用程序配置Atomikos,包括设置事务超时时间、配置数据源等。 2. **开始事务**: 通过UserTransaction接口开始一个全局事务,这将为后续的操作创建一个事务上下文。 3. **注册资源**: 将涉及的各个...
4. 配置MyBatis:为每个数据源配置一个SqlSessionFactory,并指定对应的DataSource。 5. 业务代码中处理事务:在需要处理跨数据源事务的方法上使用@Transactional注解,由Spring的AOP代理来管理事务的生命周期。 6...
4. 配置MyBatis:MyBatis需要与Spring集成,使用Spring管理SqlSessionFactory,同时需要配置使用Atomikos的数据源。 ```xml <!-- 其他MyBatis配置 --> ``` 5. 使用JTA事务:在Spring的Service层,使用`@...
总的来说,Spring4、Hibernate4和Atomikos3.3的结合使用,为开发者提供了一种强大且灵活的方式来处理多数据源的事务问题,使得在复杂分布式系统中的数据一致性得到保障。通过理解并熟练掌握这些技术,开发者可以构建...