使用SpringBoot配置多数据源的经验分享

目录
  • 1. 引入jar包
  • 2. properties配置
  • 3. 分别配置两个数据源
  • 4. Dao目录
  • 5. Entity
  • 6. Mapper文件
  • 7. Controller测试
  • 8. 结果验证

1. 引入jar包

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.multi.datasource</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

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

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

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

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

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

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2. properties配置

分别准备两个数据源

server.port=18888
mybatis.mapper-locations=classpath:mapper/*.xml

my1.datasource.url=jdbc:mysql://10.0.0.125:3306/wyl?autoReconnect=true
my1.datasource.driverClassName=com.mysql.cj.jdbc.Driver
my1.datasource.username=root
my1.datasource.password=123456

my2.datasource.url=jdbc:mysql://10.0.0.160:3306/wyl?autoReconnect=true
my2.datasource.driverClassName=com.mysql.cj.jdbc.Driver
my2.datasource.username=root
my2.datasource.password=123456

3. 分别配置两个数据源

第一个数据源

package com.multi.datasource.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = My1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "my1SqlSessionFactory")
public class My1DataSourceConfig {

    static final String PACKAGE = "com.multi.datasource.dao.my1";
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Value("${my1.datasource.url}")
    private String url;

    @Value("${my1.datasource.username}")
    private String user;

    @Value("${my1.datasource.password}")
    private String password;

    @Value("${my1.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "my1DataSource")
    public DataSource my1DataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setMaxWait(Integer.MAX_VALUE);
        dataSource.setTestOnBorrow(true);
        dataSource.setTestOnReturn(true);
        dataSource.setTestWhileIdle(true);
        return dataSource;
    }

    @Bean(name = "my1TransactionManager")
    public DataSourceTransactionManager my1TransactionManager() {
        return new DataSourceTransactionManager(my1DataSource());
    }

    @Bean(name = "my1SqlSessionFactory")
    public SqlSessionFactory my1SqlSessionFactory(@Qualifier("my1DataSource") DataSource my1DataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(my1DataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(My1DataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

第二个数据源

package com.multi.datasource.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = My1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "my1SqlSessionFactory")
public class My1DataSourceConfig {

    static final String PACKAGE = "com.multi.datasource.dao.my1";
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Value("${my1.datasource.url}")
    private String url;

    @Value("${my1.datasource.username}")
    private String user;

    @Value("${my1.datasource.password}")
    private String password;

    @Value("${my1.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "my1DataSource")
    public DataSource my1DataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setMaxWait(Integer.MAX_VALUE);
        dataSource.setTestOnBorrow(true);
        dataSource.setTestOnReturn(true);
        dataSource.setTestWhileIdle(true);
        return dataSource;
    }

    @Bean(name = "my1TransactionManager")
    public DataSourceTransactionManager my1TransactionManager() {
        return new DataSourceTransactionManager(my1DataSource());
    }

    @Bean(name = "my1SqlSessionFactory")
    public SqlSessionFactory my1SqlSessionFactory(@Qualifier("my1DataSource") DataSource my1DataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(my1DataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(My1DataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

4. Dao目录

为了区分两个数据源,分别设置了不同的目录

package com.multi.datasource.dao.my1;

import com.multi.datasource.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface Test1Mapper {

    UserEntity query();

}
package com.multi.datasource.dao.my2;

import com.multi.datasource.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface Test2Mapper {

    UserEntity query();

}

5. Entity

package com.multi.datasource.entity;

import lombok.Data;

@Data
public class UserEntity {

    private String userName;

}

6. Mapper文件

从my1数据源查询

<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multi.datasource.dao.my1.Test1Mapper">

<select id="query" resultType="com.multi.datasource.entity.UserEntity">
        select user_name as userName from t_user
    </select>

</mapper>

从my2数据源查询

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multi.datasource.dao.my2.Test2Mapper">

    <select id="query" resultType="com.multi.datasource.entity.UserEntity">
        select user_name as userName from t_user
    </select>

</mapper>

7. Controller测试

package com.multi.datasource.controller;

import com.multi.datasource.dao.my1.Test1Mapper;
import com.multi.datasource.dao.my2.Test2Mapper;
import com.multi.datasource.entity.UserEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class TestController {

    @Resource
    private Test1Mapper test1Mapper;

    @Resource
    private Test2Mapper test2Mapper;

    @RequestMapping("query")
    public void query() {
        UserEntity user1 = test1Mapper.query();
        System.out.println("my1 dataSource:" + user1);

        UserEntity user2 = test2Mapper.query();
        System.out.println("my2 dataSource:" + user2);
    }

}

两个数据源,对应的user_name分别是zhangsan和lisi

8. 结果验证

访问 http://localhost:18888/query,结果如下

到此这篇关于使用SpringBoot配置多数据源的经验分享的文章就介绍到这了,更多相关SpringBoot配置多数据源内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 亲手教你SpringBoot中的多数据源集成问题

    目录 引言 应用场景 集成方案 引言 其实对于分库分表这块的场景,目前市场上有很多成熟的开源中间件,eg:MyCAT,Cobar,sharding-JDBC等. 本文主要是介绍基于springboot的多数据源切换,轻量级的一种集成方案,对于小型的应用可以采用这种方案,我之前在项目中用到是因为简单,便于扩展以及优化. 应用场景 假设目前我们有以下几种数据访问的场景:1.一个业务逻辑中对不同的库进行数据的操作(可能你们系统不存在这种场景,目前都时微服务的架构,每个微服务基本上是对应一个数据库比较多

  • SpringBoot实现多数据源的切换实践

    目录 前言 工程结构 编码实现 yml文件 主数据源MainDatasourceProperties 其他数据源DynamicDatasourceProperties 数据源配置类DatasourceConfiguration DatasourceChooser DatasourceContext 数据源注解DatasourceScope 数据源切面DynamicDatasourceAspect 使用 前言 我们在进行软件开发的过程中,刚开始的时候因为无法估量系统后期的访问量和并发量,所以一开始

  • springboot整合多数据源配置方式

    目录 简介 一.表结构 二.多数据源整合 1. springboot+mybatis使用分包方式整合 1.1 主要依赖包 1.2 application.yml 配置文件 1.3 建立连接数据源的配置文件 1.4 具体实现 2. springboot+druid+mybatisplus使用注解整合 2.1 主要依赖包 2.2 application.yml 配置文件 2.3 给使用非默认数据源添加注解@DS 简介 主要介绍两种整合方式,分别是 springboot+mybatis 使用分包方式整

  • SpringBoot搭建多数据源的实现方法

    首先我们建立两个数据库(可以不在同一台电脑上): multiple_order: DROP DATABASE IF EXISTS `multiple_order`; CREATE DATABASE `multiple_order`; USE `multiple_order`; CREATE TABLE `order` ( `order_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '订单id', `user_id` BIGINT U

  • springboot-jta-atomikos多数据源事务管理实现

    目录 背景 源码地址 项目目录结构 实现 1.添加依赖pom.xml 2.配置数据库连接信息application.properties 3.创建多数据源DBAtomikosConfig.java 4.测试事务类TestAtomikos.java 5.测试SpringbootAtomikosApplicationTests.java 测试结果 背景 我们平时在用springboot开发时,要使用事务,只需要在方法上添加@Transaction注解即可,但这种方式只适用单数据源,在多数据源下就不再

  • SpringBoot启动多数据源找不到合适的驱动类问题

    目录 启动多数据源找不到合适的驱动类 问题 这两个jar包放在一起就找不到合数的驱动加载了 启动springboot提示驱动异常 Failed to determine a suitable driver class 在pom.xml中的build标签中添加如下代码 启动多数据源找不到合适的驱动类 问题 我项目中使用了SpringBoot多数据源,但是mysql有使用阿里的Druid连接池. <!--主从配置依赖--> <dependency> <groupId>com

  • 使用SpringBoot配置多数据源的经验分享

    目录 1. 引入jar包 2. properties配置 3. 分别配置两个数据源 4. Dao目录 5. Entity 6. Mapper文件 7. Controller测试 8. 结果验证 1. 引入jar包 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi

  • springboot配置多数据源的实例(MongoDB主从)

    相信看过上一篇文章的小伙伴已经知道了, 这章要讲的就是MongoDB主从配置. 在这边文章中,你将要学到的是在项目中配置主从数据库,并且兼容其他数据库哟..这些都是博主项目中需要并且比较重要的知识哦~ 好了,废话不多说,直接进主题. 1.pom依赖 <span style="white-space:pre"> </span><dependency> <groupId>org.springframework.boot</groupId

  • springboot 配置DRUID数据源的方法实例分析

    本文实例讲述了springboot 配置DRUID数据源的方法.分享给大家供大家参考,具体如下: druid 是阿里开源的数据库连接池. 开发时整合 druid 数据源过程. 1.修改pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> &l

  • 教你使用springboot配置多数据源

    一.建库建表 1.1 创建数据库db1和数据库db2 1.2 在数据库db1中创建表db1 CREATE TABLE `db1` ( `id` int unsigned zerofill NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int unsigned zerofill DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFA

  • springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)

    前言 前篇博客介绍了用基本的方式做多数据源,可以应对一般的情况,但是遇到一些复杂的情况就需要扩展下功能了,比如:动态增减数据源.数据源分组,纯粹多库,读写分离一主多从,从其他数据库或者配置中心读取数据源等等.其实就算没有这些需求,使用此款框架实现多数据源也比之前要便捷,快速的多 框架简介 dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器 文档:https://github.com/baomidou/dyna

  • 关于springboot配置druid数据源不生效问题(踩坑记)

    pom文件 如果你的springboot项目要用到druid,那么这三个依赖必不可少: <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--Druid--> <depen

  • springboot配置多数据源并集成Druid和mybatis的操作

    可以是mysql,oracle等多种不同数据源 项目结构 注意:只有@Primary的数据源所控制的mapper文件加注解@Mapper,否则mybatis无法切换扫描:即本文中的mapper/opener文件夹下mapper加注解 1.pom 驱动之外加入druid和mybatis等pom,整合mybatis自行搜索 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-b

  • springboot配置多数据源后mybatis拦截器失效的解决

    目录 1. 解析配置文件初始化数据源 2. 定义数据源枚举类型 3. TheadLocal保存数据源类型 4. 自定义sqlSessionProxy 5. 自定义路由 6. 定义切面,dao层定义切面 7. 最后在写库增加事务管理 8. 在配置文件中增加数据源配置 配置文件是通过springcloudconfig远程分布式配置.采用阿里Druid数据源.并支持一主多从的读写分离.分页组件通过拦截器拦截带有page后缀的方法名,动态的设置total总数. 1. 解析配置文件初始化数据源 @Conf

  • linux服务器系统中手动配置lamp服务器的经验分享

    LAMP是Linux.Apache.MySQL.PHP/Perl/Python的简称.它所组成的各组件都是开源软件,因此很方便自由的获取,导致这些组件的广泛使用,并不断完善发展,初步形成新的软件系统格局,并可能成为开源软件系统工程化的核心模式. 要安装比较新的httpd我们就必须安装比较新的apr.红帽6上就不需要再指定安装apr了,因为它默认安装的版本比较新.但是我们这里使用的是红帽5.8的版本,它给我们安装的apr版本有点老,我们要安装新版本的apr,是不是老版本的apr就要卸载了呢?这不是

  • Springboot整合JPA配置多数据源流程详解

    目录 1. Maven 2. 基本配置 DataSource 3. 多数据源配置 3.1 JpaConfigOracle 3.2 JpaConfigMysql 4. Dao层接口 1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

随机推荐