Springboot 多数据源配置

2023-10-30

Springboot 多数据源配置

       前几天工作中遇到个项目说出来比较恶心,对接老系统要求一个项目连接多个数据库,Oracle、Mysql、SqlServer,这个时候看了一些方式写了一套多数据源常用的方式,将代码分享出来。后续会将代码整体迁移到gitlub上,文章仅做快速搭建参考。

我们先用两个mysql进行操作测试,Oracle和SqlServer下篇文章来写如何应用如何连接。

项目选型 Springboot 2.6  gradle 4.6  java8  
项目下载 : https://download.csdn.net/download/qq_27535933/11435439
创建Springboot的项目就省略不写了直接粘贴一点干货。

1.gradle依赖  

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {

    //启动
    compile ('org.springframework.boot:spring-boot-starter')
    //web
    compile ('org.springframework.boot:spring-boot-starter-web')
    //lombok
    compileOnly 'org.projectlombok:lombok'
    //mysql 连接
    compile 'mysql:mysql-connector-java'
    //mybatis
    compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1")

    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

2.配置文件:现在本地的数据库创建两个datebase 一个命名test 一个命名test2, 具体配置的以后后续补上

#端口号
server.port=8090

# mysql  one
spring.datasource.mysql.jdbc-url=jdbc:mysql://localhost:3306/test
spring.datasource.mysql.username=root
spring.datasource.mysql.password=123456
spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.mysql.initialSize=5
spring.datasource.mysql.minIdle=5
spring.datasource.mysql.maxActive=20
spring.datasource.mysql.maxWait=60000
spring.datasource.mysql.timeBetweenEvictionRunsMillis=60000
spring.datasource.mysql.validationQuery=SELECT 1
spring.datasource.mysql.testWhileIdle=true
spring.datasource.mysql.testOnBorrow=false
spring.datasource.mysql.testOnReturn=false
spring.datasource.mysql.poolPreparedStatements=true
spring.datasource.mysql.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.mysql.filters=stat
spring.datasource.mysql.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

# mysql  two
spring.datasource.mysql2.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.mysql2.username=root
spring.datasource.mysql2.password=123456
spring.datasource.mysql2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.mysql2.initialSize=5
spring.datasource.mysql2.minIdle=5
spring.datasource.mysql2.maxActive=20
spring.datasource.mysql2.maxWait=60000
spring.datasource.mysql2.timeBetweenEvictionRunsMillis=60000
spring.datasource.mysql2.validationQuery=SELECT 1
spring.datasource.mysql2.testWhileIdle=true
spring.datasource.mysql2.testOnBorrow=false
spring.datasource.mysql2.testOnReturn=false
spring.datasource.mysql2.poolPreparedStatements=true
spring.datasource.mysql2.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.mysql2.filters=stat
spring.datasource.mysql2.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

3.这个数据源匹配的上面的配置文件

package com.example.config;

import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * @author YanChengLong
 * @date 2019/7/24
 * @desc 数据源配置
 */
@Configuration
public class MySqlDateSourceConfig {

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc 默认主数据源 mysql 数据库1
     */
    @Bean(name = "mysqlDataSource")
    @Qualifier("mysqlDataSource")
    @Primary // @Primary注解定义主数据源
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc mysql 数据库2
     */
    @Bean(name = "mysqlDataSource2")
    @Qualifier("mysqlDataSource2")
    @ConfigurationProperties(prefix = "spring.datasource.mysql2")
    public DataSource mysqlDataSource2() {
        return DataSourceBuilder.create().build();
    }

}

这个配置里面有一个问题需要我们注意:


这两个数据源的地方Springboot的版本写法是不一样的:

应用Springboot  v1 版本的 写法如下:
 

spring.datasource.mysql.jdbc.url=jdbc:mysql://localhost:3306/test

应用Springboot  v2 版本的 写法如下:

spring.datasource.mysql2.jdbc-url=jdbc:mysql://localhost:3306/test2

设置数据源的配置:

新建两个类 :MysqlDataSourceOneConfig   MysqlDataSourceTwoConfig

MysqlDataSourceOneConfig:

package com.example.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * @author YanChengLong
 * @date 2019/7/24
 * @desc 数据源配置1
 */
@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef  = "mysqlSqlSessionTemplate")
public class MysqlDataSourceOneConfig {

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc 创建SqlSession对象
     */
    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc 配置声明式事务管理器
     */
    @Bean(name = "mysqlTransactionManager")
    @Primary
    public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc sql会话
     */
    @Bean(name = "mysqlSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

MysqlDataSourceTwoConfig:

package com.example.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * @author YanChengLong
 * @date 2019/7/24
 * @desc 数据源配置2
 */
@Configuration
@MapperScan(basePackages = "com.example.mapper2", sqlSessionTemplateRef  = "mysqlSqlSessionTemplate2")
public class MysqlDataSourceTwoConfig {

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc 创建SqlSession对象
     */
    @Bean(name = "mysqlSqlSessionFactory2")
    @Primary
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource2") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc 配置声明式事务管理器
     */
    @Bean(name = "mysqlTransactionManager2")
    @Primary
    public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource2") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * @author YanChengLong
     * @date 2019/5/11
     * @desc sql会话
     */
    @Bean(name = "mysqlSqlSessionTemplate2")
    @Primary
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory2") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

注意这个地方: 这个地方是根据项目的目录地址创建的,主要目的是扫描下面sql,如果用XML进行编写的话也是可以的,但是建议分开来做。

整体项目的结构:


测试是没有问题的,有问题的小伙伴可以私信我,后续会补充讲解数据源的具体配置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • STC32G资料及入门介绍

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 STC32G资料及入门介绍 前言 一 资料准备 二 工程介绍 1 文件架构 总结 前言 提示 这里可以添加本文要记录的大概内容 STC32G是STC新推出的32位单片机 也就
  • 2、OpenCV加载、显示、保存图像

    OpenCV加载 显示 保存图像 一 OpenCV加载图像 二 判断图像是否加载成功 三 窗体显示图片 四 保存图像 五 完整代码示例 六 其它关于图像保存的代码例子 七 致谢 一 OpenCV加载图像 1 所用函数原型 Mat cv im
  • CAN光纤转换器 CAN光端机在久远消防主机JB-TB-JF999-H上的应用

    火灾报警主机联网问题一直是各消防项目中的难点 特别是管廊等长距离通讯中 如何保证通讯信号长期稳定可靠的运行是需要工程重点解决的问题 而LCAN FOBR系列环网冗余式CAN光纤转换器提供二路光通道和一路CAN通道 实现CAN与光纤之间的双向
  • “文明上网”

    接下来 让我们通过一些司法案例来学习如何做到 文明上网 安全上网 吧 案例一 不听劝告沉溺网络 步步深陷堕入深渊 十四岁的韩某从小就迷恋网络 家人越是劝告越是不听 到后来甚至发展到通宵到网吧打游戏 2018年3月 因无钱上网玩游戏 韩某先后
  • ajax设置滚轮效果,用 jQuery 实现页面滚动(Scroll)效果的完美方法

    以前很多博主都写过 转载过用 jQuery 实现页面滚动 Scroll 效果的方法 但目前搜来的方法大都在 Opera 下有个小 Bug 直接用跳的而且画面闪烁 今天 超级低调的高手 Willin 共享了一种完美方法解决 jQuery 实现
  • 经典进程同步问题(三)——读者写者问题

    目录 一 问题描述 二 解题思路 2 1 读者优先算法 2 2 写者优先算法 2 3 读写公平 三 源码实现 3 1 读者优先 3 2 写者优先 3 3 读写平等 一 问题描述 一个数据问价或记录可以被多个进程共享 我们把只读该文件的进程称
  • 集成学习算法:Bagging和随机森林

    学习目标 知道Bagging集成原理 知道随机森林构造过程 知道RandomForestClassifier的使用 了解baggind集成的优点 1 Bagging集成原理 目标 把下面的圈和方块进行分类 实现过程 1 采样不同数据集 2
  • Wireshark抓包——ICMP协议分析

    内容 使用Wireshark抓包 分析较简单的数据包 环境 Windows 7 Wireshark ping是用来测试网络连通性的命令 一旦发出ping命令 主机会发出连续的测试数据包到网络中 在通常的情况下 主机会收到回应数据包 ping
  • 【Linux-GNU编译器套件(gcc/g++/gfortran)离线编译安装】

    文章目录 Linux centos7 9系统GNU编译器套件 gcc g gfortran 离线编译安装 一 GNU编译器套件定义 二 GNU GCC编译环境说明 三 GNU GCC编译安装 3 1 依赖软件包安装 3 2 gcc 7 5版
  • Hexo博文发布管理工具分享出来啦

    从此刻起 小白也能搭建自己的博客 说些什么呢 之前为朋友写的一个Hexo博客发布与管理工具 只需要点点鼠标即可实现对Hexo博文的管理 从此告别各种难记的cmd命令 赠人玫瑰 手有余香 实现功能 创建博文 修改名称 删除文章 复制 粘贴 剪
  • react函数组件

    一 函数组件 1 函数组件的创建 函数组件 使用JS的函数 或箭头函数 创建的组件称为函数组件 函数组件有如下约定 函数名称必须以大写字母开头 函数组件必须有返回值 返回JSX表达式 渲染函数组件 用函数名作为组件标签名 组件名称可以是单标
  • BGA封装扇出过孔-BGA芯片的布局布线技巧

    bga封装扇出过孔 图文并茂讲解BGA芯片的布局布线技巧 谁不言的博客 CSDN博客 因此处理BGA芯片的布局和走线已经成为工程师的必修功课 本篇文章将向大家介绍BGA芯片的布局布线技巧 BGA芯片布局的基本顺序 1 对BGA芯片进行摆放
  • 用python写一个爬虫程序,爬取百度的源码

    我可以为您提供一个简单的Python爬虫程序的示例 它可以帮助您爬取百度的源码 导入所需要的模块 import requests from bs4 import BeautifulSoup 获取百度源码 url https www baid
  • vue封装树形组件

    效果 1 组件
  • Apache Druid命令执行漏洞(CVE-2021-25646)复现

    0x00 漏洞概述 Apache Druid 是用Java编写的面向列的开源分布式数据存储 旨在快速获取大量事件数据 并在数据之上提供低延迟查询 Apache Druid 包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代
  • 硬链接和软连接的区别

    硬链接和软连接的主要区别在于 硬链接和源文件具有相同的inode节点号和block 硬链接和源文件是同一份文件 软连接和源文件的inode节点号不同 进而指向的block也不同 软连接block中存放了源文件的路径名 硬链接 源文件和硬链接
  • Postman 批量导出接口:如何快速备份你的 API

    在使用 Postman 接口测试工具时 我们可能会需要将多个接口进行导出 以备后续使用或与他人共享 下面将介绍如何使用 Postman 批量导出接口 步骤一 进入集合 首先 我们需要进入 Postman 中的集合 该集合中包含了我们需要导出
  • 数据库的部分依赖,完全依赖,传递依赖以及三种范式

    第一范式1NF 列不可再分 关系模式R都是不可分 第二范式2NF 满足完全依赖 可唯一标识一行 如主键id 消除部分依赖 如果依赖于主属性的非空真子集 那么就不满足完全依赖 要拆分成一对多的关系 第三范式3NF 不存在传递依赖 不依赖于非主
  • JSR303校验之list校验问题

    现有需求如下 新增合同时要保存补贴和费用项信息 由于都是多条 所以用list传参 但不是必传项 不传的时候不校验list中的对象 传的时候就要校验list中对象每个字段都不能为空 也就是要通过JSR303实现 当请求对象中传list 需要校
  • Springboot 多数据源配置

    Springboot 多数据源配置 前几天工作中遇到个项目说出来比较恶心 对接老系统要求一个项目连接多个数据库 Oracle Mysql SqlServer 这个时候看了一些方式写了一套多数据源常用的方式 将代码分享出来 后续会将代码整体迁