mybatis-spring-boot-starter中设定多数据源,并实现Durid的监控

news2024/9/28 23:25:03

实现功能:
1: 配置两个数据源,根据不同的mapper路径使用不同的数据连接
2 :使用Druid连接池
3:Druid 可监控多个数据源的sql执行操作

分析:
在这里插入图片描述

在这里插入图片描述

查看mybatis_spring_boot_stater中关于自动装配的类可知【如上图】,需要自定义实现SqlsessionFactory和SqlSessionTemplate的Bean,其中public SqlSessionFactory sqlSessionFactory(DataSource dataSource) 方法依赖于DataSource数据源。所以需要根据不同的数据源配置,自定义配置不同的数据源Bean。然后配置不同的数据源在实现含有SqlsessionFactory 和SqlSessionTemplate的配置。

1 导入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

  <dependencies>

<!--持久层框架mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
            <exclusions>
                <!-- 排除默认的 HikariCP 数据源 -->
                <exclusion>
                    <groupId>com.zaxxer</groupId>
                    <artifactId>HikariCP</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


<!--mysql连接-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

<!--druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>

<!--监测-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

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

    </dependencies>

2 application.yml

spring:
  datasource:
    first:
       password: Liuyifei@@
       username: root
       driver-class-name: com.mysql.cj.jdbc.Driver
       url:  jdbc:mysql://localhost:3306/face?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
    second:
       password: Liuyifei@@
       username: root
       driver-class-name: com.mysql.cj.jdbc.Driver
       url: jdbc:mysql://localhost:3306/project_guli?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8

    #   设置druid连接池 通用配置
    druid:
          initial-size: 3
          max-active: 8
          max-wait: 60000
          test-on-borrow: false
          test-on-return: false
          test-while-idle: true
          min-evictable-idle-time-millis: 300000
          pool-prepared-statements: true
          max-pool-prepared-statement-per-connection-size: 20
          # 配置监控统计拦截的filters
          filters: stat,wall,slf4j
          filter:
            stat:
              enabled: true
              log-slow-sql: true
              slow-sql-millis: 5000

          stat-view-servlet:
            login-password: admin
            login-username: admin
            enabled: true
            allow: 10.157.147.149
            url-pattern: /druid/*
            reset-enable: fasle

          web-stat-filter:
            enabled: true
            session-stat-enable: true
            sessionStatMaxCount: 20
            url-pattern: /*
            exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"

3 编码配置Druid数据源

根据application.yml可知,分为数据连接的特殊配置和通用配置。根据springboot和Durid的整合可知,SpringBoot整合Druid数据源(实行监控功能)
spring框架会读取prefix 为spring.datasource.druid的一系列配置信息自动装载成为DruidDataSource的Bean,因此可将通用配置放在spring.datasource.druid下,非通用配置后续再通过setXXX()进行设置

/**
 * @Author lyf
 * @Date 2023/2/16 - 09:40
 * @Description
 **/
@Data
@ConfigurationProperties(prefix = "spring.datasource.first")
public class FirstDataSourceProperties {

    private String username;
    private String password;
    private String url;
    private String driverClassName;
}
/**
 * @Author lyf
 * @Date 2023/2/16 - 10:11
 * @Description
 **/
@Data
@ConfigurationProperties(prefix = "spring.datasource.second")
public class SecondDataSourceProperties {

    private String username;
    private String password;
    private String url;
    private String driverClassName;
}

/**
 * @Author lyf
 * @Date 2023/2/15 - 16:48
 * @Description 多数据源配置
 * 启用Druid数据源的通用设置和区别配置类数据
 **/
@Configuration
@EnableConfigurationProperties({
        FirstDataSourceProperties.class,
        SecondDataSourceProperties.class
})
public class DatasourceConfiguration {

    FirstDataSourceProperties d1;
    SecondDataSourceProperties d2;
    public DatasourceConfiguration(FirstDataSourceProperties d1,SecondDataSourceProperties d2){
        this.d1=d1;
        this.d2=d2;
    }


    @ConfigurationProperties("spring.datasource.druid")
    @Primary
    @Bean
    public DruidDataSource firstDatasource(){
        //通过spring.datasource.druid 加载通用配置
        DruidDataSource source = new DruidDataSource();
        
        //设置数据源的特殊配置
        source.setUsername(d1.getUsername());
        source.setPassword(d1.getPassword());
        source.setUrl(d1.getUrl());
        source.setDriverClassName(d1.getDriverClassName());
        return source;
    }


    @ConfigurationProperties("spring.datasource.druid")
    @Bean
    public DruidDataSource secondDatasource(){
        //通过spring.datasource.druid 加载通用配置
        DruidDataSource source = new DruidDataSource();
        //设置数据源的特殊配置
        source.setUsername(d2.getUsername());
        source.setPassword(d2.getPassword());
        source.setUrl(d2.getUrl());
        source.setDriverClassName(d2.getDriverClassName());
        return source;   
    }

}

使用@ConfigurationProperties注解将配置信息与JavaBean进行绑定。
@EnableConfigurationProperties和@ConfigurationProperties的用法可参考我的上一篇文章 注解ConfigurationProperties、EnableConfigurationProperties的用法
当前配置中仅有数据源的连接信息不同,可通过DruidDataSource 的setXXX()方法进行属性的设定,如有其它的特殊的配置可根据application.yml的配置进行设定

4 Mybatis配置实现不同Mapper路径使用不同的数据源

/**
 * @Author lyf
 * @Date 2023/2/15 - 16:52
 * @Description
 * com.example.multimybatisdatasourcedemo.mapper.mapper1 下使用数据源1
 **/
@MapperScan(
        basePackages = "com.example.multimybatisdatasourcedemo.mapper.mapper1",
        sqlSessionFactoryRef = "sqlSessionFactoryPrimary",
        sqlSessionTemplateRef = "sqlSessionTemplatePrimary")
@Configuration
public class FirstMybatisConfiguration {

    private DataSource firstDatasource;

    /**
     * 构造函数,注入第一个数据源
     * @param firstDatasource
     */
    public FirstMybatisConfiguration(@Qualifier("firstDatasource") DataSource firstDatasource) {
        this.firstDatasource = firstDatasource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(firstDatasource);
        return bean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryPrimary());
    }

}
/**
 * @Author lyf
 * @Date 2023/2/15 - 16:52
 * @Description
 * com.example.multimybatisdatasourcedemo.mapper.mapper2 下使用数据源2
 **/
@MapperScan(
        basePackages = "com.example.multimybatisdatasourcedemo.mapper.mapper2",
        sqlSessionFactoryRef = "sqlSessionFactorySecond",
        sqlSessionTemplateRef = "sqlSessionTemplateSecond")
@Configuration
public class SecondMybatisConfiguration {

    private DataSource secondDatasource;

    /**
     * 构造函数,注入第二个数据源
     * @param secondDatasource
     */
    public SecondMybatisConfiguration(@Qualifier("secondDatasource") DataSource secondDatasource) {
        this.secondDatasource = secondDatasource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactorySecond() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(secondDatasource);
        return bean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateSecond() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactorySecond());
    }

}

在这里插入图片描述

能够做到多个数据源的关键点 就是每个数据源所扫描的mapper包不一样,谁扫描到哪个mapper那么该mapper就用哪个数据源,同时都扫到了,就用添加@Primary 的数据源。
用 @Primary 标志该 Bean。标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean优先被考虑。本文抢到mybatis的配置,所以忽略Mapper的编写和Controller的代码编写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于动力学模型的无人驾驶车辆主动转向控制

章五 基于动力学模型的无人驾驶车辆主动转向控制 主动转向控制联合仿真 基于动力学模型的无人驾驶车辆主动转向控制 无人驾驶车辆模型预测控制第五章&#xff08;上&#xff09; 无人驾驶车辆模型预测控制第五章&#xff08;下&#xff09; 北理工无人驾驶车辆模型预测控制第4…

测试新版Android Studio的手机镜像效果

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为669字&#xff0c;预计阅读2分钟 前言 春节刚上班&#xff0c;就开始了疯狂出差的节奏&#xff0c;期间发现Android Studio发布新的版本2022.1.1(Electric Eel)&#xff0c;里面两个更新的内容蓝牙模拟器和…

ChatGPT 帮我自动编写 Python 爬虫脚本

都知道最近ChatGPT聊天机器人爆火&#xff0c;我也想方设法注册了账号&#xff0c;据说后面要收费了。 ChatGPT是一种基于大语言模型的生成式AI&#xff0c;换句话说它可以自动生成类似人类语言的文本&#xff0c;把梳理好的有逻辑的答案呈现在你面前&#xff0c;这完全不同于…

2023美赛数学建模资料思路模型

美赛我们为大家准备了大量的资料&#xff0c;我们会在比赛期间给大家分析美题目和相关的思路 全文都是干货&#xff0c;大家仔细阅读&#xff0c;资料文末自取&#xff01; 首先我们来看美赛23年题型的一个变化&#xff1a; 美赛23年题目变化&#xff1a; A题&#xff1a;连…

【C语言】初识指针

目录 一、指针是什么 二、指针和指针类型 三、野指针 四、指针运算 五、指针和数组 六、二级指针 七、指针数组 一、指针是什么 指针就是内存地址&#xff0c;指针变量是用来存放内存地址的变量&#xff0c;在同一CPU构架下&#xff0c;不同类型的指针变量所占用的存储单元长度…

2023年2月的十篇深度学习论文推荐

本月的论文包括语言模型、扩散模型、音乐生成、多模态等主题。 1、MusicLM: Generating Music From TextPage https://arxiv.org/abs/2301.11325 By Andrea Agostinelli, Timeo I. Denk, et al. 扩散模型和自回归离散模型都在生成音乐/音频显示出令人印象深刻的性能。 与最…

第45期:一条 SQL 语句优化的基本思路

SQL 语句优化是一个既熟悉又陌生的话题。面对千奇百怪的 SQL 语句&#xff0c;虽然数据库本身对 SQL 语句的优化一直在持续改进、提升&#xff0c;但是我们不能完全依赖数据库&#xff0c;应该在给到数据库之前就替它做好各种准备工作&#xff0c;这样才能让数据库来有精力做它…

FreeMarker生成word文档,固定word模板

该方法也就是通过freemarker生成固定的word文档&#xff0c;动态的word模板布局不能用该方法。 也就是必须有一个固定的模板文档是.ftl类型 如果初始文件为 需要手动改为&#xff1a; 也就是所有需要替换的地方&#xff0c;都需要有${XX}替换。 主要步骤为&#xff1a; 将 w…

JVM学习8: 字符串

基本特性 代表不可变字符序列final不可被继承实现了Serializable、Comparable等接口jdk8及以前使用final char[]存储&#xff0c;jdk9开始改为使用byte[]存储通过字面量方式给一个字符串变量赋值&#xff0c;此时字符串对象在字符串常量池里面 字符串常量池 字符串常量池不会…

《论文阅读》PAL: Persona-Augmented Emotional Support Conversation Generation

《论文阅读》PAL: Persona-Augmented Emotional Support Conversation Generation 前言简介思路出发点相关知识coefficient of determination任务定义模型框架实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望?…

企企通:企业供应商风险管理,如何用采购管理软件赋能?

企业采购过程中&#xff0c;最怕/最担心的事情无非是&#xff1a;供应链异常。供应链异常&#xff0c;也就是我们常说的供应链风险&#xff0c;可以简单分为需求风险、供应商风险、物流风险和财务风险四大类。其中&#xff0c;最为突出的风险便是供应商风险。从寻找合适的供应商…

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

目录 一、VSCode安装 二、VSCode简单配置 三、Vue.js的下载和引入 四、Vue.js第一个应用 一、VSCode安装 Visual Studio Code是一个轻量级但功能强大的源代码编辑器&#xff0c;可在您的桌面上运行&#xff0c;可用于Windows&#xff0c;macOS和Linux。它内置了对JavaScrip…

阿里一P7员工为证明自己年入百万,晒出工资,却被网友...

阿里的工资在行业内确实是比较高的一类&#xff0c;之前网络上流传着阿里P7年入百万的消息也不是空穴来风&#xff0c;日前&#xff0c;有位阿里P7员工&#xff0c;为了证明自己的确年入百万&#xff0c;晒出了他的工资&#xff0c;网友们看完都沸腾了。什么情况&#xff1f;一…

BSN全球伙伴大会于本周五召开在即,重磅嘉宾演讲主题前瞻

“第三届区块链服务网络&#xff08;BSN&#xff09;全球合作伙伴大会”召开在即&#xff0c;将于2023年2月17日&#xff08;本周五&#xff09;在杭州市拱墅区举办。 BSN已邀请到来自国内外的行业专家学者与生态合作伙伴&#xff0c;与各界来宾就“建设数字中国”指导思想中的…

iOS 客户端 IM 消息卡片插件化

背景 目前探探 IM 聊天消息列表由于长年累月的代码堆积&#xff0c;对业务迭代产生了很多的困扰。所以趁着工作中的一些空隙&#xff0c;对聊天页消息卡片做了插件化&#xff0c;使得不同的消息类型&#xff0c;可以根据具体需求方便的增删迭代。下面分享一下自己重构过程中一…

项目经理,千万不要在这时候跳槽

早上好&#xff0c;我是老原。节后开工也一段时间了&#xff0c;有不少小友私信老原想要面试题库&#xff0c;大多都是想要跳槽涨薪的......当然除了在做准备的&#xff0c;也有不少朋友都在诉苦&#xff1a;其实&#xff0c;不少人回头去看自己过去经验感觉就像个打杂的&#…

PCB中的HDI板生产中的变化

关键词&#xff1a;HDI概述 HDI发展演变 HDI生产难点如果把一整个电子产业比作浩瀚的宇宙&#xff0c;那些智能电子设备就像宇宙中闪耀的星光&#xff0c;当你以“上帝”的视角手持放大镜去观察时&#xff0c;这些闪烁的星光点点其实都是一个个由精密的“自然规律”所“设计”好…

金三银四丨黑蛋老师带你剖析-CTF岗

作者丨黑蛋二进制是个庞大的方向&#xff0c;对应着许许多多方向的岗位&#xff0c;除了之前说过的逆向岗位&#xff0c;漏洞岗位&#xff0c;病毒岗位&#xff0c;还有专门打CTF的岗位&#xff0c;CTF是网络安全领域的一种比赛。普遍来讲&#xff0c;大学生学习网络安全都会参…

percona软件介绍 、 innobackupex备份与恢复

1. 常用的mysql备份工具 物理备份缺点&#xff1a; 跨平台差。备份时间长、冗余备份、浪费存储空间。 解释如下&#xff1a;如Linux操作系统和Windows操作系统之间&#xff0c;由于文件系统不一样&#xff0c;如Linux操作系统的文件系统是ext4、xfs&#xff0c;Windows操作系统…

K8s+SpringBoot+gRpc

本文使用K8s当做服务注册与发现、配置管理&#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…