Springboot结合JDBC实现双数据源实例

 更新时间:2023年12月10日 11:37:38   作者:慈祥的茶壶  
这篇文章主要为大家介绍了Springboot结合JDBC实现双数据源实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

配置文件

spring:
  application:
    name: tuberculosis
  datasource:
    tuberculosis:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://127.0.0.1:3306/tuberculosis?useUnicode=true&characterEncoding=utf8&useSSL=false
      username: root
      password: root
      type: com.zaxxer.hikari.HikariDataSource
      hikari:
        minimum-idle: 5
        maximum-pool-size: 100
        auto-commit: true
        idle-timeout: 30000
        pool-name: DatabookHikariCP
        max-lifetime: 1800000
        connection-timeout: 30000
        connection-test-query: SELECT 1
    jkjc:
      driver-class-name: com.mysql.jdbc.Driver
      jdbc-url: jdbc:mysql://127.0.0.1:3306/jkjc?useUnicode=true&characterEncoding=utf8&useSSL=false
      username: root
      password: root
      type: com.zaxxer.hikari.HikariDataSource
      hikari:
        minimum-idle: 5
        maximum-pool-size: 100
        auto-commit: true
        idle-timeout: 30000
        pool-name: DatabookHikariCP
        max-lifetime: 1800000
        connection-timeout: 30000
        connection-test-query: SELECT 1

注意:单个数据库的配置为url,而在多个数据源的时候url可能启动会报错,需要使用jdbc-url

配置类

package com.daryl.config.db;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.util.HashMap;
/**
 * @author daryl
 * @create 2023/12/08
 */
@Component
public class DataSourceConfig {
    @Bean(name = "tuberculosis")
    @ConfigurationProperties(prefix = "spring.datasource.tuberculosis")
    public DataSource dataSourceOne() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "jkjc")
    @ConfigurationProperties(prefix = "spring.datasource.jkjc")
    public DataSource dataSourceTwo() {
        return DataSourceBuilder.create().build();
    }
    @Bean("dynamicDatasource")
    @Primary
    public DataSource dynamicDataSource(@Qualifier("tuberculosis") DataSource tuberculosis,@Qualifier("jkjc") DataSource jkjc) {
        DynamicDatasource dynamicDatasource = new DynamicDatasource();
        dynamicDatasource.setDefaultTargetDataSource(tuberculosis);
        HashMap<Object, Object> dsMap = new HashMap<>();
        dsMap.put("tuberculosis", tuberculosis);
        dsMap.put("jkjc", jkjc);
        dynamicDatasource.setTargetDataSources(dsMap);
        return dynamicDatasource;
    }
    @Bean
    public PlatformTransactionManager transactionManager(@Qualifier("dynamicDatasource") DataSource dynamicDatasource) {
        return new DataSourceTransactionManager(dynamicDatasource);
    }
}
package com.daryl.config.db;
/**
 * @author daryl
 * @create 2023/12/08
 */
public class DatasourceUtil {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    public static void setDB(String dbType) {
        contextHolder.set(dbType);
    }
    public static String getDB() {
        return contextHolder.get();
    }
    public static void clearDB() {
        contextHolder.remove();
    }
}
package com.daryl.config.db;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
 * @author daryl
 * @create 2023/12/08
 */
public class DynamicDatasource extends AbstractRoutingDataSource {
    private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDatasource.class);
    @Override
    protected Object determineCurrentLookupKey() {
        LOGGER.debug("动态获取数据源{}",DatasourceUtil.getDB());
        return DatasourceUtil.getDB();
    }
}

创建controller测试

@RequestMapping("/db1")
    public Object db1(@RequestBody HashMap<String, String> map) {
        //db1的用户表
        return userMapper.selectById(map.get("id"));
    }
@RequestMapping("/db2")
    public Object db2() {
        DatasourceUtil.setDB("jkjc");
        //db2的任务表
        AssessmentTaskEntity assessmentTaskEntity = assessmentTaskMapper.selectById("1");
        DatasourceUtil.clearDB();
        User user = userMapper.selectById("1");
        System.out.println("user = " + user);
        return assessmentTaskEntity;
    }

以上就是Springboot结合JDBC实现双数据源实例的详细内容,更多关于Springboot JDBC双数据源的资料请关注脚本之家其它相关文章!

相关文章

  • 详解JAVA之运算符

    详解JAVA之运算符

    这篇文章主要介绍了详解Java中运算符以及相关的用法讲解,一起跟着小编学习下吧,希望能够给你带来帮助
    2021-11-11
  • SpringBoot自定义bean绑定实现

    SpringBoot自定义bean绑定实现

    这篇文章主要介绍了SpringBoot自定义bean绑定,最常见的配置绑定的场景,是在自定义的bean中通过@Value注解将某个属性和对应的配置绑定
    2022-10-10
  • Netty与NIO超详细讲解

    Netty与NIO超详细讲解

    Netty本质上是一个NIO的框架,适用于服务器通讯相关的多种应用场景。底层是NIO,NIO底层是Java IO和网络IO,再往下是TCP/IP协议,下面我们跟随文章来详细了解
    2022-08-08
  • Java的List集合框架之ArrayList详解

    Java的List集合框架之ArrayList详解

    这篇文章主要介绍了Java的List集合框架之ArrayList详解,ArrayList默认容量为10(构造方法未指定初始容量为0),扩容是利用位运算(右移一位)和直接相加进行1.5倍扩容,需要的朋友可以参考下
    2023-11-11
  • Idea之没有网络的情况下创建SpringBoot项目的方法实现

    Idea之没有网络的情况下创建SpringBoot项目的方法实现

    本文主要介绍了Idea之没有网络的情况下创建SpringBoot项目的方法实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Java JSch远程执行Shell命令的方法

    Java JSch远程执行Shell命令的方法

    本文主要介绍了Java JSch远程执行Shell命令,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 使用Java后台实现弹出框页面的代码案例

    使用Java后台实现弹出框页面的代码案例

    在现代Web应用中,弹出框(Modal)是一个常见且重要的UI组件,通过弹出框,我们可以实现用户交互、表单提交、信息提示等功能,本篇博客将详细介绍如何使用Java后台实现弹出框页面,并展示具体的代码案例和运行效果,需要的朋友可以参考下
    2024-08-08
  • 深入了解Java数据结构和算法之堆

    深入了解Java数据结构和算法之堆

    这篇文章主要为大家介绍了Java数据结构和算法之堆 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 通过Java读取xml文件内容过程解析

    通过Java读取xml文件内容过程解析

    这篇文章主要介绍了通过Java读取xml文件内容过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 后端java压缩图片超详细图文教程

    后端java压缩图片超详细图文教程

    这篇文章主要给大家介绍了关于后端java压缩图片的相关资料,片压缩是一种广泛采用的技术,它不仅能显著减小文件大小,释放更多存储空间,还能提升图片加载速度,避免长时间等待,需要的朋友可以参考下
    2024-04-04

最新评论