springboot+mybatis配置多数据源实战

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 一般一个项目中只会连接一个数据库.但是随着需求变更,会要求同一个项目中连接多个数据库,本文就讲一下如何在一个项目中对多个数据库进行连接.本文基于springboot+mybatis介绍如何进行多数据源连接(本文演示配置两个数据库,配置多个同理).

1.背景说明


    一般一个项目中只会连接一个数据库.但是随着需求变更,会要求同一个项目中连接多个数据库,本文就讲一下如何在一个项目中对多个数据库进行连接.本文基于springboot+mybatis介绍如何进行多数据源连接(本文演示配置两个数据库,配置多个同理).


2.配置多数据源步骤


2.1 项目结构变更

    以连接不同的数据库进行分包,db1表示连接数据库database1,db2表示连接database2.项目结构如下:

267327c2e09962ca3ce57185015de37a_2f61bdf2526d4c8daa944a8239eda6af.png


2.2添加配置类

/**
 * @ClassName: MultiDataSourceConfig
 * @Desc: 多数据源配置
 * @Author: txm
 * @Date: 2022/12/11 9:59
 **/
@Configuration
public class MultiDataSourceConfig {
  // 创建自定义数据源db1
    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource businessDbDataSource() {
        return DataSourceBuilder.create().build();
    }
  // 创建自定义数据源db2
    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource newhomeDbDataSource() {
        return DataSourceBuilder.create().build();
    }
}


Db1Config配置类:

@Configuration
// 此处添加项目自定义mapper包路径,支持数组形式,指定SqlSessionFactory ,演示包路径已做修改
@MapperScan(basePackages = {"com.api.db1.order.mapper",
        "com.api.db1.pay.mapper",
        "com.api.db1.user.mapper",
        "com.api.db1.distribution.mapper",
        "com.api.db1.aliyun.mapper" }, sqlSessionFactoryRef = "sqlSessionFactoryDb1")
public class Db1Config {
    @Autowired
    @Qualifier("db1")
    private DataSource dataSourceDb1;
    @Bean
    public SqlSessionFactory sqlSessionFactoryDb1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb1);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/**/*.xml"));
        // 自定义MyBatis configuration.配置打印和大小写转换
        org.apache.ibatis.session.Configuration personalConfiguration = new org.apache.ibatis.session.Configuration();
        personalConfiguration.setMapUnderscoreToCamelCase(true);
        personalConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(personalConfiguration);
        return factoryBean.getObject();
    }
    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb1());
    }
}


Db2Config配置类:


@Configuration
// 此处添加项目自定义mapper包路径,支持数组形式,指定SqlSessionFactory ,演示包路径已做修改
@MapperScan(basePackages = {"com.api.db2.activityUser.mapper",
"com.api.db2.vote.mapper"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class Db2Config {
    @Autowired
    @Qualifier("db2")
    private DataSource dataSourceDb2;
    @Bean
    public SqlSessionFactory sqlSessionFactoryDb2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb2);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/**/*.xml"));
        // 自定义MyBatis configuration.配置打印和大小写转换
        org.apache.ibatis.session.Configuration personalConfiguration = new org.apache.ibatis.session.Configuration();
        personalConfiguration.setMapUnderscoreToCamelCase(true);
        personalConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(personalConfiguration);
        return factoryBean.getObject();
    }
    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb2());
    }
}


   说明

   自定义配置类Db1Config 、Db2Config中指定 @MapperScan之后可以将启动类上面的@MapperScan注解进行注释,@MapperScan的作用就是扫描mapper所在的包路径:

// modify by txm 2022/12/12 多数据源改造,包扫描添加到自定义数据源配置类Db1Config、Db2Config中
//@MapperScan("com.**.mapper")
@SpringBootApplication
public class H5Application {
    public static void main(String[] args) {
        SpringApplication.run(H5Application.class, args);
    }
}


   配置类中指定mapper配置文件所在路径,否则会提示:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found),添加内容如下::

factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/**/*.xml"));


   对应的配置文件是(可以进行注释):


mybatis:
     # 配置数据库映射文件 **表示是任意多级目录,适配dao/goods
    mapper-locations: classpath:/mapper/**/**/*.xml


   配置mybatis的日志打印与大小写转换:

// 自定义MyBatis configuration.配置打印和大小写转换
        org.apache.ibatis.session.Configuration personalConfiguration = new org.apache.ibatis.session.Configuration();
        personalConfiguration.setMapUnderscoreToCamelCase(true);
        personalConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(personalConfiguration);


   添加之后配置文件中可以将以下内容进行注释:

mybatis:
     # 配置数据库映射文件 **表示是任意多级目录,适配dao/goods
    mapper-locations: classpath:/mapper/**/**/*.xml
     #spring boot集成mybatis的方式打印sql
    configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     #spring boot记成mybatis将数据库字段字段转换华成驼峰形式
        map-underscore-to-camel-case: true


2.3 修改配置文件数据连接配置信息

spring:

#数据库信息设置
  datasource:
    db1:   # database1服务器地址
      jdbc-url: jdbc:mysql://xxx.xxx.xx.xx:3308/database1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
      username: ****
      password: ****
      driver-class-name: com.mysql.cj.jdbc.Driver
    db2:  # database2服务器地址 
      jdbc-url: jdbc:mysql://xxx.xxx.xx.xx:3308/database2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
      username: ****
      password: ****
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 配置数据库连接池
      type: com.zaxxer.hikari.HikariDataSource
      hikari:
        minimum-idle: 5  # 最小空闲连接数量
        idle-timeout: 180000 # 单位毫秒,此处设置3分钟,空闲连接存活最大时间,默认600000(10分钟)
        maximum-pool-size: 10 # 连接池最大连接数,默认是10
        auto-commit: true     # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
        pool-name: MyHikariCP  # 连接池名称
        max-lifetime: 1800000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
        connection-timeout: 30000  # 数据库连接超时时间,默认30秒,即30000


   注意:要将url替换成jdbc-url,否则会提示以下内容:

java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.


   关于数据库连接类型可以选用springboot默认支持的Hikari,性能会更好!如果对Hikari无配置要求,可以不用添加Hikari相关的配置信息.演示内容中配置了db2的Hikari信息.

   以上是关于springboot中配置多数据源的实战记录,希望对有同样需求的同学有所帮助,感觉有所收获欢迎点赞或是留言!


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL Java 数据库连接
SpringBoot整合Mybatis
SpringBoot整合Mybatis
19 2
|
17天前
|
运维 监控 安全
云HIS医疗管理系统源码——技术栈【SpringBoot+Angular+MySQL+MyBatis】
云HIS系统采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分,功能易扩展;支持多样化灵活配置,提取大量公共参数,无需修改代码即可满足不同客户需求;服务组织合理,功能高内聚,服务间通信简练。
32 4
|
11天前
|
Java 关系型数据库 数据库
Spring Boot多数据源及事务管理:概念与实战
【4月更文挑战第29天】在复杂的企业级应用中,经常需要访问和管理多个数据源。Spring Boot通过灵活的配置和强大的框架支持,可以轻松实现多数据源的整合及事务管理。本篇博客将探讨如何在Spring Boot中配置多数据源,并详细介绍事务管理的策略和实践。
36 3
|
14天前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
|
16天前
|
Java 数据库连接 mybatis
【SpringBoot】整合Mybatis
【SpringBoot】整合Mybatis
14 2
|
28天前
|
Java 数据库连接 数据库
MyBatis之旅:从零开始的环境搭建与配置
MyBatis之旅:从零开始的环境搭建与配置
39 1
|
28天前
|
Java 关系型数据库 MySQL
整合SpringBoot与MyBatis时报错时区异常
整合SpringBoot与MyBatis时报错时区异常
15 0
|
1月前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
1月前
|
Java 关系型数据库 MySQL
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
|
2月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
66 1