做品牌网站哪个好用,seo关键词挖掘工具,移动端关键词优化,兰州新区建设局网站地址在我们日常的开发中#xff0c;经常会用到一个项目中使用多个数据源的问题#xff0c;本次就带你了解怎样在spring boot项目中使用mybatis整合多个数据源的示例。使用spring boot3.5版本
1、创建一个spring boot项目#xff0c;并引入相应的maven依赖 dependencies…在我们日常的开发中经常会用到一个项目中使用多个数据源的问题本次就带你了解怎样在spring boot项目中使用mybatis整合多个数据源的示例。使用spring boot3.5版本
1、创建一个spring boot项目并引入相应的maven依赖 dependenciesdependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-openapi3-jakarta-spring-boot-starter/artifactIdversion4.5.0/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.3/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.20/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies2、在配置文件中设置相应的连接信息
spring:datasource:# 主数据源zh:jdbc-url: jdbc:mysql://localhost:3306/zh?useSSlfalseuseUnicodetruecharacterEncodingutf-8serverTimezoneUTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver# 次数据源en:jdbc-url: jdbc:mysql://localhost:3306/en?useSSlfalseuseUnicodetruecharacterEncodingutf-8serverTimezoneUTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath:/mapper/**/*.xmlconfiguration:map-underscore-to-camel-case: true
这里需要注意的一点是我们引入了mybatis-springboot的自动装配的依赖那么项目在启动的时候会检查我们有没有配置默认的数据源连接信息如果没有配置会报错。这个时候我们有两种解决思路。一种是在配置文件中指定一下连接信息但是这个数据连接信息我们不用另一种是把数据源自动配置的bean给排除掉。需要在启动类上指定
SpringBootApplication(exclude {DataSourceAutoConfiguration.class})
3、手动指定多数据源的连接配置
我的项目中是指定了两套数据源分别为zh、en。我只需要配置两套数据连接信息即可
配置zh数据库的连接配置
Configuration
MapperScan(basePackages com.zq.testmybatis.mapper.zh,sqlSessionFactoryRef zhSqlSessionFactory
)
public class ZhMyBatisConfig {/*** 创建并返回一个以 spring.datasource.zh 为前缀的配置属性绑定的数据源对象。** return DataSource 对象*/PrimaryBeanConfigurationProperties(prefix spring.datasource.zh)public DataSource zhDataSource() {return DataSourceBuilder.create().build();}/*** 创建中文数据库SQL会话工厂。** param dataSource 数据源必须被标注为Qualifier(zhDataSource)* return SqlSessionFactory 对象* throws Exception 抛出异常*/PrimaryBeanpublic SqlSessionFactory zhSqlSessionFactory(Qualifier(zhDataSource) DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);// 重点手动启用驼峰映射org.apache.ibatis.session.Configuration configuration new org.apache.ibatis.session.Configuration();configuration.setMapUnderscoreToCamelCase(true); // 启用驼峰映射sessionFactory.setConfiguration(configuration);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(classpath:mapper/zh/**/*.xml));return sessionFactory.getObject();}/*** 创建一个名为zhSqlSessionTemplate的SqlSessionTemplate对象该对象使用名为zhSqlSessionFactory的SqlSessionFactory。** param sqlSessionFactory 类型为SqlSessionFactory用于创建SqlSessionTemplate对象的SqlSessionFactory。* return 返回类型为SqlSessionTemplate的zhSqlSessionTemplate对象。*/PrimaryBeanpublic SqlSessionTemplate zhSqlSessionTemplate(Qualifier(zhSqlSessionFactory) SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}配置en数据库的连接信息
Configuration
MapperScan(basePackages com.zq.testmybatis.mapper.en,sqlSessionFactoryRef enSqlSessionFactory
)
public class EnMyBatisConfig {/*** 创建并返回一个名为 enDataSource 的数据源。** return 返回一个配置为 spring.datasource.en 前缀的配置属性的数据源*/BeanConfigurationProperties(prefix spring.datasource.en)public DataSource enDataSource() {return DataSourceBuilder.create().build();}/*** 创建一个 SqlSessionFactory Bean使用指定的数据源。** param dataSource 数据源通过 Qualifier 注解指定* return SqlSessionFactory 对象* throws Exception 如果在创建 SqlSessionFactory 过程中发生异常*/Beanpublic SqlSessionFactory enSqlSessionFactory(Qualifier(enDataSource) DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);// 重点手动启用驼峰映射org.apache.ibatis.session.Configuration configuration new org.apache.ibatis.session.Configuration();configuration.setMapUnderscoreToCamelCase(true); // 启用驼峰映射sessionFactory.setConfiguration(configuration);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(classpath:mapper/en/**/*.xml));return sessionFactory.getObject();}/*** 创建一个SqlSessionTemplate对象** param sqlSessionFactory 数据库会话工厂通过Qualifier注解指定使用enSqlSessionFactory* return 返回创建的SqlSessionTemplate对象*/Beanpublic SqlSessionTemplate enSqlSessionTemplate(Qualifier(enSqlSessionFactory) SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}这里需要我们注意的主要有两点mapper接口的扫射路径、XML文件的扫射路径
还有一点要注意的是由于我们是手动指定了XML路径的连接信息所有如果spring项目在启动时扫描到你指定的XML地址下没有相应的XML文件时项目会报错。
4、使用多数据源
配置好了以上的所有信息之后我们就可以正常的使用mapper接口来进行数据操作了。这里要提醒的一点是两个数据源的mapper接口尽量不要相同因为我们是在同一个spring boot中也就是这两个mapper接口都会被扫描到IOC容器中。
RestController
public class TestController {
Resourceprivate EnUserMapper enUserMapper;
Resourceprivate ZhUserMapper zhUserMapper;
PostMapping(/addEnUser)
public String addEnUser(RequestBody EnUser enUser) {enUserMapper.insert(enUser);return success;
}
GetMapping(/getEnUser)
public ListEnUser getEnUser() {return enUserMapper.listAll();
}PostMapping(/addZHUser)public String addZhUser(RequestBody ZhUser zhUser) {zhUserMapper.insert(zhUser);return success;}
GetMapping(/getZhUser)public ListZhUser getZhUser() {return zhUserMapper.listAll();}}就和我们正常使用一样就可以了
5、多数据源的事务一致性
在单个数据源中我们只需要使用Transactional注解就能保证事务的一致性但是在多数据源中不行但是同样有解决的办法我们可以使用JTA分布式事务Atomikos或者分布式事务seata
首先介绍一下JTA是基于XA协议的两阶段提交2PC属于Java EE规范的一部分。事务由应用服务器如WebLogic、JBoss的事务管理器TM协调数据库作为资源管理器RM实现XA接口它的工作流程为 阶段一TM询问所有RM是否可提交RM锁定资源并返回准备状态。 阶段二TM根据RM反馈决定全局提交或回滚。特点强一致性但存在同步阻塞阶段一锁定资源和单点故障风险。
seata是阿里巴巴开源分布式事务框架相应的特性可以看我之前写的这篇文章
seata的快速入门和实战_seata快速入门-CSDN博客
维度JTA/XASeata事务模型基于XA协议的2PC支持AT、TCC、Saga、XA多种模式一致性强一致性实时生效AT模式为最终一致性TCC/XA为强一致性性能低阶段一长期锁资源高AT模式一阶段提交释放锁14侵入性无代码侵入依赖数据库XA驱动AT模式无侵入TCC需业务编码补偿逻辑57架构依赖强依赖应用服务器如WebLogic独立中间件与Spring Cloud等微服务框架集成26资源要求数据库需支持XA协议AT模式无需XA驱动仅需本地事务支持13锁机制数据库行锁AT模式通过全局锁lock_table避免脏写
这两种方法都能解决多数据源的数据不一致问题具体使用哪一种就看你自己的业务场景了。