SpringBoot配置多数据源

2023-11-01

项目框架:SpringBoot + MyBatis + Mysql
项目连接两个数据库源。
1、application.yml配置

  • 使用DruidDataSource
  • 主数据库为primary,副数据库为secondary,名称可以自己定义,只要和后续的配置文件config相对应即可
spring:
  datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      #druid相关配置
      druid:
        #监控统计拦截的filters
        filters: stat
        #配置初始化大小/最小/最大
        initial-size: 5
        min-idle: 5
        max-active: 100
        #获取连接等待超时时间
        max-wait: 60000
        #间隔多久进行一次检测,检测需要关闭的空闲连接
        time-between-eviction-runs-millis: 60000
        #一个连接在池中最小生存的时间
        min-evictable-idle-time-millis: 300000
        validation-query: SELECT 'x'
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
        #打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
        pool-prepared-statements: false
        max-pool-prepared-statement-per-connection-size: 20
      primary:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://10.0.254.101:3306/test001?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false # 测试
        username: root
        password: 123456
      secondary:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://10.0.254.102:3306/test001?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false # 测试
        username: root
        password: 123456

2、在config包下新增配置文件:PrimaryDataSourceConfig和SecondaryDataSourceConfig,结构如下:
在这里插入图片描述

PrimaryDataSourceConfig:


```java
@Configuration
@MapperScan(basePackages = "com.test.dao.primary", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDataSourceConfig {

    private static final String MAPPER_LOCATION = "classpath:mapper/primary/*.xml";

    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primarySqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //设置mapper配置文件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
        return bean.getObject();
    }

    @Bean(name = "primaryTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

SecondaryDataSourceConfig:

@Configuration
@MapperScan(basePackages = "com.test.dao.secondary", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfig {

    private static final String MAPPER_LOCATION = "classpath:mapper/secondary/*.xml";

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //设置mapper配置文件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
        return bean.getObject();
    }

    @Bean(name = "secondaryTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3、dao层文件结构如下所示,要分开来存放,因为上面配置了basePackages
在这里插入图片描述

StudentDao示例代码如下:
StudentDao:

@Repository
public interface StudentDao {
    int selectStudentById(Long id);
}

4、Mapper文件
结构如下,一样需要分文件夹,因为在上述配置文件中指定了mapper文件夹MAPPER_LOCATION :
在这里插入图片描述

5、StudentMapper.xml文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.primary.StudentDao">
    <select id="selectStudentById" parameterType="java.lang.Long"  resultType="com.test.entity.Student">
        select *
        from student
        where id = #{id}
    </select>
</mapper>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot配置多数据源 的相关文章

随机推荐

  • virsh help domain命令内容解析

    简介 这段时间学习热迁移 要不断的在qemu monitor和libvirt中调转使用命令 故整理virsh命令 这篇是第一篇 整理virsh help domain相关内容 span style color 656565 span sty
  • 相约清华!AI药物研发大赛总决赛明日开幕

    2022年 百度飞桨联合清华大学药学院 筹备建设 AI 药学 产学研融合创新基地 推出了一系列AI 生物计算前沿课程和人才培养计划 今年5月 百度飞桨联合清华大学药学院 百度智能云和临港实验室 共同发起了首届全球AI药物研发算法大赛 并得到
  • mac如何卸载python2.7_mac python环境的安装与卸载

    换电脑之前并没有了解很多mac 所以习惯性的安装软件都是官网或者appstore下载来安装的 so 我下载了python2 7 并安装了 后来学习的视频是3 6的版本 又下载的3 6的版本来安装 过程中知道自带python2 7版本 也看到
  • 踩坑系列—mybatis查询没有数据时返回的list是null还是空集合?

    场景 根据多个条件查询 返回list集合数据 代码 第1步 根据页面多个条件查询 List list userDao queryOrders queryParams if null list return null 第2步 有数据再追加其他
  • Photoshop 通道讲解

    我常常问我的学生 什么是Photoshop最重要 不可或缺的功能 很多人的回答是图层 Layer 其实在Photoshop3 0之前根本没有图层的功能 在Photoshop的领域中 最重要的功能是选取范围 正确的运用选取范围 才能够做出精准
  • 从CSV文件导入Hive出现中文乱码问题解决

    关于HIVE中文乱码问题的解决办法 网上有很多帖子 然而很多都是基于LINUX终端显示字符的修改 其实上对于一些条件下的HIVE中文乱码问题是无法解决的 如从CSV文件导入到HIVE中出现的中文乱码问题 大家都知道 HIVE原生的字符编码是
  • 区块链密码学之对称加密

    前言 对称加密 顾名思义就是公钥和私钥都是同一个 只有一把密钥 那么密钥的共享就需要特别注意 容易泄露 但是由于它的加密效率高 速度快 占用空间小 主要用在大量数据的加密 往往需要提前分发密钥 对称密码从实现上可以分为两种 分组密码和序列密
  • 查询Windows默认编码格式

    开始 gt cmd gt chcp 然后显示一个数字 如936 则代表是GBK简体中文
  • unity生成透明背景的截图,截图背景图透明,UGUI scrollview滑动的时候不能遮罩3d模型

    转载 Unity3D Unity3D 摄像机带透明截图 静茹 鱼 博客园 using System using UnityEngine using System IO public class CropPicture MonoBehavio
  • Sonarqube安装插件报错An error has occurred. Please contact your administrator

    报错信息 Sonarqube安装插件时提示 An error has occurred Please contact your administrator 解决方法 1 查询报错日志 使用docker logs查询Sonarqube日志 插
  • jpress代码审计分享

    声明 出品 先知社区 ID 1871162774168111 以下内容 来自先知社区的1871162774168111作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作
  • 【转载】一些比较好的电子资源网站

    SkyEye Project SkyEye是一个开源软件 opensource software 项目 中文名字是 天目 SkyEye的目标是在通用的Linux和Windows平台实现一个模拟集成开发环境 模拟基于ARM的嵌入式计算机系统
  • 《Linux C++》线程池

    为什么使用线程池 线程池的出现正是着眼于减少线程本身带来的开销 避免 即时创建 即时销毁 线程池应用场合 像大多数网络服务器 包括Web服务器 Email服务器以及数据库服务器处理数目巨大的连接请求 但处理时间却相对较短 并且实时性要求比较
  • 硬见小百科」这些PCB布局布线规则,你了解多少?

    元器件布局的10条规则 遵照 先大后小 先难后易 的布置原则 即重要的单元电路 核心元器件应当优先布局 布局中应参考原理框图 根据单板的主信号流向规律安排主要元器件 元器件的排列要便于调试和维修 亦即小元件周围不能放置大元件 需调试的元 器
  • Java中的sort()

    sort的第一种格式 sort的第二种格式 sort函数中cmp函数的使用方法 自定义排序基本方法 sort的第一种格式 sort函数的基本格式 默认排序为升序排序 Arrays sort 数组名 起始下标 终止下标 例 import ja
  • 【机器学习】机器学习建模调参方法总结

    文章目录 一 前言 1 1 数据来源 1 2 理论简介 二 知识总结 2 1 回归分析 2 2 长尾分布 2 3 欠拟合与过拟合 2 4 正则化 2 5 调参方法 2 5 1 贪心调参 坐标下降 2 5 2 网格调参GridSearchCV
  • JavaScript高手进阶:详解Eval加密

    在JavaScript编程中 涉及到代码加密 在混淆加密时代之前 用的最多的应该是种Eval加密 加密后的特征是以 eval function p a c k e r 为代码开始 相信很多人都见过这种代码 Eval加密效果例程 这是一种非常
  • MFC 解决中文乱码问题

    新的编译工具默认的是unicode编码方式 许多在多字节下面显示中文的方法已经不再适用了按照道理说设置为unicode编码后应该会很好的支持中文 但是实际情况很悲惨 显示的都是乱码 看到网上的很多方法都是把CSTRING转来转去 很头疼 感
  • powershell 删除指定文件夹及文件

    删除指定的文件夹 Get ChildItem C ccccc Recurse Where Object PsIsContainer Where Object FullName like test Remove Item Force Recu
  • SpringBoot配置多数据源

    项目框架 SpringBoot MyBatis Mysql 项目连接两个数据库源 1 application yml配置 使用DruidDataSource 主数据库为primary 副数据库为secondary 名称可以自己定义 只要和后