随笔 - 434,  文章 - 0,  评论 - 463,  阅读 - 46万

前言

之前在使用SpringBoot搭建后台服务的过程中,一般都是访问一个数据库,一个数据源.这次在新的项目中由于使用的MQTT服务,需要进行鉴权操作,但是MQTT服务有多个项目使用,所以它的鉴权数据库在一个单独的数据库中,这时候我们就需要在SpringBoot配置多数据源.

整体来说是比较简单的,但是对于我这个小白也是折腾了一天多,现在也是很多原理没有搞懂,这里只能算是记录一下,方便以后的查找.

在这里插入图片描述

配置 application.yml

首先要在 application.yml 中配置两个数据源,这里我就以我工程中为例,主库的数据源叫做main,数据库叫做mqtt,这里大家可以自定义,不过多叙述了.具体如下所示.

spring:
  datasource:
    main:
      url: jdbc:mysql://************************************
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    mqtt:
      url: jdbc:mysql://************************************
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver

多数据源配置类

新增一个 DataSourceConfig 数据源配置类.具体代码如下所示.

/**
 * 数据库多数据源配置
 */
@Configuration
public class DataSourceConfig {

    // GreenRoom主数据库配置
    @Primary
    @Bean(name = "mainDataSourceProperties")
    @ConfigurationProperties(prefix = "spring.datasource.main")
    public DataSourceProperties mainDataSourceProperties() {
        return new DataSourceProperties();
    }

    // GreenRoom主数据库 数据源
    @Primary
    @Bean(name = "mainDataSource")
    public DataSource mainDataSource(@Qualifier("mainDataSourceProperties") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    // mqtt数据库数据源配置
    @Bean(name = "mqttDataSourceProperties")
    @ConfigurationProperties(prefix = "spring.datasource.mqtt")
    public DataSourceProperties mqttDataSourceProperties() {
        return new DataSourceProperties();
    }

    // mqtt数据库数据源
    @Bean("mqttDataSource")
    public DataSource mqttDataSource(@Qualifier("mqttDataSourceProperties") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }
}

Main和Mqtt数据源配置类

上面已经把多数据源配置类设置完成了,接下来,我们就要Main和Mqtt数据源进行各自单独的配置了,单独配置的意义就在于让Main和Mqtt 去扫描自己的Dao.java和 Dao.xml.

首先我们先看一下,我的项目具体的目录结构,可能不太规范…大家见谅.

在这里插入图片描述
接下来,我们就具体看一下main数据源的配置类,这里以我项目中的 GreenRoomDataSourceConfig 为例.

/**
 * 主数据库Mapper配置
 */
@Configuration
@MapperScan(basePackages ="com.dong.gen.mapper", sqlSessionTemplateRef  = "mainSqlSessionTemplate")
public class GreenRoomDataSourceConfig {

    // 主数据源 main数据源
    @Primary
    @Bean("mainSqlSessionFactory")
    public SqlSessionFactory mainSqlSessionFactory(@Qualifier("mainDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/dong/gen/mapper/**/*.xml"));
        return sqlSessionFactory.getObject();
    }

    @Primary
    @Bean(name = "mainTransactionManager")
    public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Primary
    @Bean(name = "mainSqlSessionTemplate")
    public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

然后再看一下 MqttDataSourceConfig 这个配置类.

/**
 * MQTT数据库Mapper配置
 */
@Configuration
@MapperScan(basePackages ="com.dong.mqtt.mapper", sqlSessionTemplateRef  = "mqttSqlSessionTemplate")
public class MqttDataSourceConfig {
    // MQTT数据源
    @Bean("mqttSqlSessionFactory")
    public SqlSessionFactory mqttSqlSessionFactory(@Qualifier("mqttDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource);
        sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/dong/mqtt/mapper/*.xml"));
        return sqlSessionFactory.getObject();
    }

    @Bean(name = "mqttTransactionManager")
    public DataSourceTransactionManager mqttTransactionManager(@Qualifier("mqttDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mqttSqlSessionTemplate")
    public SqlSessionTemplate mqttSqlSessionTemplate(@Qualifier("mqttSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
} 

这两个文件的核心是扫包的配置代码,具体如下所示.

@MapperScan(basePackages ="com.dong.gen.mapper", sqlSessionTemplateRef  = "mainSqlSessionTemplate")

sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/dong/gen/mapper/**/*.xml"));
@MapperScan(basePackages ="com.dong.mqtt.mapper", sqlSessionTemplateRef  = "mqttSqlSessionTemplate")

sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/dong/mqtt/mapper/*.xml"));

转载自:https://www.jianshu.com/p/79d3d7ec1bdc

posted on   剽悍一小兔  阅读(36)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2016-10-16 简单粗暴,详细得不要不要的 JavaWeb快速入门实例(1)

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示