当前位置: 首页 > news >正文

springboot提升-多数据源配置

文章目录

      • 1. 添加依赖
      • 2. 配置数据源
        • 示例配置:
      • 3. 创建数据源 Bean
      • 4. 创建动态数据源
      • 5. 配置 MyBatis SqlSessionFactory
      • 6. 在业务代码中使用
      • 注意事项

在 Spring Boot 中配置 MyBatis 以支持多数据源涉及几个关键步骤,包括配置数据源、集成 MyBatis 以及动态数据源切换机制。以下是详细的配置步骤:

1. 添加依赖

确保你的项目中包含必要的依赖,例如 MySQL 驱动、Spring Boot Starter JDBC 或者 MyBatis 的相关依赖。

<!-- MySQL 驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency><!-- Spring Boot JDBC Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency><!-- MyBatis Starter -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>

2. 配置数据源

application.propertiesapplication.yml 文件中添加每个数据源的配置信息。

示例配置:
# 数据源1配置
spring.datasource.db1.url=jdbc:mysql://host1:3306/db1
spring.datasource.db1.username=user1
spring.datasource.db1.password=password1
spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver# 数据源2配置
spring.datasource.db2.url=jdbc:mysql://host2:3306/db2
spring.datasource.db2.username=user2
spring.datasource.db2.password=password2
spring.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver

3. 创建数据源 Bean

在 Spring Boot 的配置类中,为每个数据源创建对应的 DataSource Bean。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean(name = "db1")@ConfigurationProperties(prefix = "spring.datasource.db1")public DataSource db1DataSource() {return DataSourceBuilder.create().build();}@Bean(name = "db2")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource db2DataSource() {return DataSourceBuilder.create().build();}
}

4. 创建动态数据源

创建一个 DynamicDataSource 类来动态地改变当前线程绑定的数据源。

线程池切换范围在一个线程内, 如果涉及多个线程, 那么需要在线程范围内进行线程池切换

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;public class DynamicDataSource extends AbstractRoutingDataSource {private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();public static void setDataSource(String dataSourceName) {CONTEXT_HOLDER.set(dataSourceName);}public static void clearDataSource() {CONTEXT_HOLDER.remove();}@Overrideprotected Object determineCurrentLookupKey() {return CONTEXT_HOLDER.get();}public void afterPropertiesSet() {super.afterPropertiesSet();Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("db1", db1DataSource);targetDataSources.put("db2", db2DataSource);setTargetDataSources(targetDataSources);}
}

5. 配置 MyBatis SqlSessionFactory

配置 SqlSessionFactory 来使用动态数据源。

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class MyBatisConfig {@Autowiredprivate DataSource dynamicDataSource;@Beanpublic SqlSessionFactory sqlSessionFactory() throws Exception {SqlSessionFactoryBean factory = new SqlSessionFactoryBean();factory.setDataSource(dynamicDataSource);factory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return factory.getObject();}
}

6. 在业务代码中使用

在业务代码中使用之前定义的动态数据源,可以通过如下的方式直接切换数据源。也可以通过在方法上添加注解来指定使用哪个数据源,这里会涉及到切面的开发。

import com.example.datasource.DynamicDataSource;public class Service {@Transactional(readOnly = true)public void serviceMethodForDb1() {DynamicDataSource.setDataSource("db1");// 操作 db1 数据源DynamicDataSource.clearDataSource();}@Transactional(readOnly = true)public void serviceMethodForDb2() {DynamicDataSource.setDataSource("db2");// 操作 db2 数据源DynamicDataSource.clearDataSource();}
}

注意事项

  • 确保事务管理正确配置,特别是在涉及多个数据源的事务处理中。
  • 数据源的选择逻辑应该清晰,并且易于维护。
  • 考虑到性能问题,频繁的数据源切换可能会导致性能下降,因此要权衡利弊。
  • 如果使用了事务管理器,请确保它支持多数据源场景下的事务处理。

以上步骤展示了如何在 Spring Boot 中配置 MyBatis 以支持多数据源。根据实际应用的需求,你可能需要调整某些配置细节。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用C#在指定目录下创建文件夹的全面指南
  • Adobe Illustrator非矢量图片的交集利用剪切蒙版实现
  • 设计模式应用
  • OpenCV 之 模版匹配多个对象、图片旋转 综合应用
  • Java 面试题:从源码理解 ThreadLocal 如何解决内存泄漏 ConcurrentHashMap 如何保证并发安全 --xunznux
  • 深入解析Flink SQL:基本概念与高级应用
  • 生活杂记1
  • C#基础(6)值类型和引用类型
  • 【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信
  • java 防重复提交
  • P2343 宝石管理系统
  • SpringBoot开发——整合MyBatis
  • 人工智能在C/C++中的应用
  • VitePress 自定义主题:打造专属文档网站
  • 数学建模笔记—— 整数规划和0-1规划
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • __proto__ 和 prototype的关系
  • 【node学习】协程
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • javascript面向对象之创建对象
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Spring Boot快速入门(一):Hello Spring Boot
  • spring boot下thymeleaf全局静态变量配置
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue2.x学习三:事件处理生命周期钩子
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 初识 webpack
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 浏览器缓存机制分析
  • 前端存储 - localStorage
  • 实战|智能家居行业移动应用性能分析
  • 用 Swift 编写面向协议的视图
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 智能合约Solidity教程-事件和日志(一)
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​虚拟化系列介绍(十)
  • # 达梦数据库知识点
  • #include<初见C语言之指针(5)>
  • #QT(一种朴素的计算器实现方法)
  • #Z0458. 树的中心2
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (补)B+树一些思想
  • (二)学习JVM —— 垃圾回收机制
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分类)KNN算法- 参数调优
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (接口自动化)Python3操作MySQL数据库
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)四层和七层负载均衡的区别
  • (自适应手机端)响应式服装服饰外贸企业网站模板