MyBatis整合Springboot多数据源实现

这篇具有很好参考价值的文章主要介绍了MyBatis整合Springboot多数据源实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

数据源,实际就是数据库连接池,负责管理数据库连接,在Springboot中,数据源通常以一个bean的形式存在于IOC容器中,也就是我们可以通过依赖注入的方式拿到数据源,然后再从数据源中获取数据库连接。

那么什么是多数据源呢,其实就是IOC容器中有多个数据源的bean,这些数据源可以是不同的数据源类型,也可以连接不同的数据库。

本文将对多数据如何加载,如何结合MyBatis使用进行说明,知识点脑图如下所示。

MyBatis整合Springboot多数据源实现

正文

一. 数据源概念和常见数据源介绍

数据源,其实就是数据库连接池,负责数据库连接的管理和借出。目前使用较多也是性能较优的有如下几款数据源。

  1. TomcatJdbcTomcatJdbcApache提供的一种数据库连接池解决方案,各方面都还行,各方面也都不突出;
  2. DruidDruid是阿里开源的数据库连接池,是阿里监控系统Dragoon的副产品,提供了强大的可监控性和基于Filter-Chain的可扩展性;
  3. HikariCPHikariCP是基于BoneCP进行了大量改进和优化的数据库连接池,是Springboot 2.x版本默认的数据库连接池,也是速度最快的数据库连接池。

二. Springboot加载数据源原理分析

首先搭建一个极简的示例工程,POM文件引入依赖如下所示。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
复制代码

编写一个Springboot的启动类,如下所示。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
复制代码

再编写一个从数据源拿连接的DAO类,如下所示。

@Repository
public class MyDao implements InitializingBean {

    @Autowired
    private DataSource dataSource;

    @Override
    public void afterPropertiesSet() throws Exception {
        Connection connection = dataSource.getConnection();
        System.out.println("获取到数据库连接:" + connection);
    }

}
复制代码

application.yml文件中加入数据源的参数配置。

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      max-lifetime: 1600000
      keep-alive-time: 90000
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.101.8:3306/test?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
    username: root
    password: root
复制代码

其中urlusernamepassword是必须配置的,其它的仅仅是为了演示。

整体的工程目录如下。

MyBatis整合Springboot多数据源实现

负责完成数据源加载的类叫做DataSourceAutoConfiguration,由spring-boot-autoconfigure包提供,DataSourceAutoConfiguration的加载是基于Springboot的自动装配机制,不过这里说明一下,由于本篇文章是基于Springboot2.7.6版本,所以没有办法在spring-boot-autoconfigure包的spring.factories文件中找到DataSourceAutoConfiguration,在Springboot2.7.x版本中,是通过加载META-INF/spring/xxx.xxx.xxx.imports文件来实现自动装配的,但这不是本文重点,故先在这里略做说明。

下面先看一下DataSourceAutoConfiguration的部分代码实现。

@AutoConfiguration(before = SqlInitializationAutoConfiguration.class)
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import(DataSourcePoolMetadataProvidersConfiguration.class)
public class DataSourceAutoConfiguration {

    ......

    @Configuration(proxyBeanMethods = false)
    @Conditional(PooledDataSourceCondition.class)
    @ConditionalOnMissingBean({DataSource.class, XADataSource.class})
    @Import({DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
            DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
            DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class})
    protected static class PooledDataSourceConfiguration {

    }

    ......

}
复制代码

上述展示出来的代码,做了两件和加载数据源有关的事情。

  1. 将数据源的配置类DataSourceProperties注册到了容器中;
  2. DataSourceConfiguration的静态内部类Hikari注册到了容器中。

先看一下DataSourceProperties的实现,如下所示。

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {

	private ClassLoader classLoader;

	private boolean generateUniqueName = true;

	private String name;

	private Class<? extends DataSource> type;

	private String driverClassName;

	private String url;

	private String username;

	private String password;
	
	......
	
}
复制代码

DataSourceProperties中加载了配置在application.yml文件中的spring.datasource.xxx等配置,像我们配置的typedriver-class-nameurlusernamepassword都会加载在DataSourceProperties中。

再看一下DataSourceConfiguration的静态内部类Hikari的实现,如下所示。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
        matchIfMissing = true)
static class Hikari {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    HikariDataSource dataSource(DataSourceProperties properties) {
        HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
        if (StringUtils.hasText(properties.getName())) {
            dataSource.setPoolName(properties.getName());
        }
        return dataSource;
    }

}
复制代码

可知Hikari会向容器注册一个HikariCP的数据源HikariDataSource,同时HikariDataSource也是一个配置类,其会加载application.yml文件中的spring.datasource.hikari.xxx等和HikariCP相关的数据源配置,像我们配置的max-lifetimekeep-alive-time都会加载在HikariDataSource中。

然后还能发现,创建HikariDataSourcecreateDataSource方法的第一个参数是容器中的DataSourcePropertiesbean,所以在创建HikariDataSource时,肯定是需要使用到DataSourceProperties里面保存的相关配置的,下面看一下DataSourceConfigurationcreateDataSource() 方法的实现。

protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {
    return (T) properties.initializeDataSourceBuilder().type(type).build();
}
复制代码

DataSourcePropertiesinitializeDataSourceBuilder() 方法会返回一个DataSourceBuilder,具体实现如下。文章来源地址https://www.toymoban.com/news/detail-420890.html

public DataSourceBuilder<?> initializeDataSourceBuilder() {
    r

到了这里,关于MyBatis整合Springboot多数据源实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【万字长文】SpringBoot整合MyBatis搭建MySQL多数据源完整教程(提供Gitee源码)

    前言:在我往期的博客介绍了2种关于如何使用SpringBoot搭建多数据源操作,本期博客我参考的是目前主流的框架,把最后一种整合多数据源的方式以博客的形式讲解完,整合的过程比较传统和复杂,不过我依旧会把每个实体类的思路都给大家讲解清楚的,项目的最后我都会提

    2024年02月14日
    浏览(44)
  • SpringBoot 整合 Neo4j、MySQL 多数据源方案(Druid Mybatis DynamicDatasource)

    本文总结了Neo4j和Spring/SpringBoot、Alibaba Druid、Dynamic Datasource、Mybatis等整合方案,对相应配置做了详细说明。 添加Neo4j JDBC Driver依赖 添加application.yml配置 添加Neo4j JDBC Driver + Alibaba Druid依赖 添加application.yml配置 添加Neo4j JDBC Driver、Alibaba Druid、Dynamic DataSource依赖 添加application.y

    2023年04月08日
    浏览(51)
  • springboot+mybatis实现多数据源

    最近做项目碰到了一个需要连4个不同数据库的需求,其中db1、db2表结构都不相同;另外两个数据库same_db_private、same_db_public表结构完全相同,一个对内一个对外,只是从物理上隔离了数据而已。 所以打算通过静态配置包路径的方式来实现db1、db2的操作,并且通过扩展Spring的

    2024年02月09日
    浏览(42)
  • SpringBoot结合MyBatis实现多数据源配置

    SpringBoot框架实现多数据源操作,首先需要搭建Mybatis的运行环境。 由于是多数据源,也就是要有多个数据库,所以,我们创建两个测试数据库,分别是:【sp-demo01】和【sp-demo02】,如下图所示: 具体SQL代码: 创建【sp-demo01】数据库。 创建【sp-demo02】数据库。 MyBatis框架中,

    2024年02月09日
    浏览(37)
  • springboot+mybatis实现mysql和oracle多数据源

    在实际项目中很多时候会涉及到多个数据库的访问,或者数据库读写分离的形式。 下面通过使用 Aspect+注解来实现mysql+oracle的多数据源配置(注意:事务一致性未提供) 首先要去oracle官网下载ojdbc的jar包,根据oracle的版本去下载,或者在下载的oracle的jdbc包下的lib里面有,然后

    2024年02月07日
    浏览(60)
  • springBoot-Mybatis-Plus 多数据源切换实现

    前言:本文主要通过AbstractRoutingDataSource,实现根据 http 访问携带的标识动态切换数据源; 1 AbstractRoutingDataSource 介绍: AbstractRoutingDataSource 是 Spring 框架中的一个抽象类,它可以用来实现动态数据源切换。在多数据源场景下,AbstractRoutingDataSource 可以根据不同的请求来动态地选

    2024年02月03日
    浏览(51)
  • SpringBoot整合mysql、postgres、sqlserver实现多数据源配置案例

            分享一下近期处理的一个小demo,关于配置多数据源实现不同服务之间的数据推送和数据治理。第一次接触到pg库和sqlserver一头雾水,选择了JDBC+mybatis-plus的方式去链接。 1、首先要引入以下依赖 2、demo的项目结构如下 3、yml配置文件 4、配置类 5、controller、dao、service以

    2024年02月06日
    浏览(47)
  • Spring Boot整合Mybatis配置多数据源

    在之前的事件管理系统博客中有提到动态的多数据源配置 工作中难免需要做几个工具方便自己偷懒,加上之前的挡板,数据源肯定没法单一配置,所以需要多数据源配置。这里介绍两种配置:动态数据源和固定数据源模式。这两种我在目前的工作的工具开发中都有用到。 M

    2024年01月23日
    浏览(71)
  • 【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

    前言:在最近的实际开发的过程中,遇到了在多数据源的情况下要保证原子性的问题,这个问题当时遇到了也是思考了一段时间,后来通过搜集大量资料与学习,最后是采用了分布式事务来解决这个问题,在讲解之前,在我往期的博客提前搭好了一个SpringBoot整合MyBatis搭建M

    2024年02月14日
    浏览(42)
  • springboot整合多数据源的配置以及动态切换数据源,注解切换数据源

    在许多应用程序中,可能需要使用多个数据库或数据源来处理不同的业务需求。Spring Boot提供了简便的方式来配置和使用多数据源,使开发人员能够轻松处理多个数据库连接。如果你的项目中可能需要随时切换数据源的话,那我这篇文章可能能帮助到你 ℹ️:这里对于pom文件

    2024年02月10日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包