springboot配置druid多数据源的示例代码

下面是“springboot配置druid多数据源的示例代码”的完整攻略。

目录

准备工作

在开始配置Druid多数据源之前,我们需要先进行一些准备工作:

  1. 确认使用的Spring Boot版本,本示例使用的是 2.4.2 版本。
  2. 添加相关依赖,包括 spring-boot-starter-jdbcdruid-spring-boot-starter 等。
<dependencies>
    <!-- Spring Boot JDBC依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- Druid连接池依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.6</version>
    </dependency>
    <!-- MySQL连接驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
</dependencies>

配置Druid数据源

application.yml 配置文件中添加如下配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    filters: stat
    maxActive: 20
    initialSize: 1
    maxWait: 60000
    minIdle: 1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false

这里我们使用的是Druid连接池来管理数据源,因此需要设置 type 参数为 com.alibaba.druid.pool.DruidDataSource,并且添加Druid连接池的配置项,比如 maxActiveinitialSize 等。

配置多数据源

添加多数据源配置类 DataSourceConfig,用于创建多个数据源,并通过 @Primary 注解指定默认数据源。

@Configuration
public class DataSourceConfig {

    @Bean(name = "dataSource1")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource1() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "dataSource2")
    @ConfigurationProperties(prefix = "spring.datasource2")
    public DataSource dataSource2() {
        return DruidDataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "dynamicDataSource")
    public DataSource dynamicDataSource(@Qualifier("dataSource1") DataSource dataSource1,
                                        @Qualifier("dataSource2") DataSource dataSource2) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map<Object, Object> dataSourceMap = new HashMap<>(2);
        dataSourceMap.put("dataSource1", dataSource1);
        dataSourceMap.put("dataSource2", dataSource2);
        dynamicDataSource.setDefaultTargetDataSource(dataSource1);
        dynamicDataSource.setTargetDataSources(dataSourceMap);
        return dynamicDataSource;
    }

}

在配置类中创建两个数据源 dataSource1dataSource2,并使用 @Qualifier 注解指定对应的 @Bean 名称,这里我们还可以为每个数据源指定不同的属性配置。

然后创建 dynamicDataSource 数据源,这里我们使用了 DynamicDataSource 类,其实现了 AbstractRoutingDataSource 接口,通过重写 determineCurrentLookupKey() 方法来动态切换数据源。

最后添加 @Primary 注解指定默认数据源为 dataSource1

测试多数据源

为了测试多数据源是否配置成功,我们可以添加一个测试方法,依次使用 dataSource1dataSource2 执行SQL语句,确保两个数据源都能正常使用。

@Service
public class UserService {

    @Autowired
    @Qualifier("dynamicDataSource")
    private DataSource dataSource;

    public List<User> listUsers() {
        List<User> userList = new ArrayList<>();
        try (Connection conn = dataSource.getConnection()) {
            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery("SELECT * FROM user");
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setName(rs.getString("name"));
                user.setAge(rs.getInt("age"));
                userList.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return userList;
    }

    public List<User> listUsers2() {
        List<User> userList = new ArrayList<>();
        try {
            Connection conn = dataSource.getConnection();
            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery("SELECT * FROM user2");
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setName(rs.getString("name"));
                user.setAge(rs.getInt("age"));
                userList.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return userList;
    }

}

这里我们定义了两个方法 listUsers()listUsers2(),分别使用 dataSource1dataSource2 执行SQL语句,获取查询结果。

示例代码

完整示例代码可以在下面的Github仓库中找到:

https://github.com/rainspooky/springboot-druid-multi-datasource

该示例包含了创建两个数据表 useruser2,以及 @Mapper 接口、实体类等相关代码。你可以直接按照该示例进行配置和测试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot配置druid多数据源的示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • spring注解 @PropertySource配置数据源全流程

    Spring注解 @PropertySource 用于加载指定的属性源,是Spring Framework 4.0版本之后提供的新特性。它允许我们从外部文件或环境变量中读取配置信息,灵活地管理我们的应用程序的数据源。 下面是使用 @PropertySource 配置数据源的完整流程: 引入依赖 在项目的 pom.xml 文件中添加以下依赖: <depe…

    Java 2023年6月2日
    00
  • SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    标题: SPRING FRAMEWORK BEAN作用域和生命周期原理解析 1. BEAN的作用域 在Spring框架中,Bean的作用域是非常重要的概念。它决定了一个Bean对象在容器中的生命周期,也就是对象创建和销毁的时间。总的来说,Spring框架中Bean的作用域有以下4种: 1.1 单例模式(Singleton) 在Spring框架中,只要我们不进…

    Java 2023年5月19日
    00
  • 关于Java跨域Json字符转类对象的方法示例

    下面我就针对“关于Java跨域Json字符转类对象的方法示例”的完整攻略,进行详细讲解,希望能够帮助到你。 1. 什么是跨域? 首先,我们需要明白什么是跨域。跨域是指在同一个浏览器中,一个网站的JavaScript代码试图去访问另一个网站的代码。 在Web安全领域中,浏览器出于安全考虑,禁止页面中的JavaScript代码访问其它域下的资源,包括Cookie…

    Java 2023年5月26日
    00
  • 浅谈spring security入门

    浅谈Spring Security入门 简介 Spring Security是Spring框架的安全性解决方案之一。它为Spring应用程序提供了身份验证、授权和其他安全功能。Spring Security是一种基于过滤器的安全性实现,可通过在Web应用程序中添加一组过滤器来提供许多基本的安全性机制,如基本认证、表单认证、单点登录等。 安装 在maven项目…

    Java 2023年5月20日
    00
  • Java常用排序算法及性能测试集合

    Java常用排序算法及性能测试集合 在本文中,我们将介绍Java的常用排序算法,包括它们的工作原理、实现代码和性能测试。排序算法是计算机科学中最基本的算法之一,因此深入了解排序算法有助于提高编程技能和算法能力。 常用排序算法 冒泡排序 冒泡排序是最简单,也是最容易理解的排序算法之一。它的基本思想是比较相邻的元素,如果顺序不对就交换它们,每一轮都可以将最大的值…

    Java 2023年5月19日
    00
  • Java程序控制逻辑—流程控制

    关于“Java程序控制逻辑—流程控制”的完整攻略,我会从以下几个方面进行讲解: 流程控制的基本概念 条件语句 循环语句 例子说明 1. 流程控制的基本概念 在编写Java程序时,我们需要按照一定的逻辑来控制程序的执行顺序。流程控制就是指通过条件判断和循环来控制程序中语句的执行顺序,使程序按照我们设定的逻辑进行。 Java的流程控制主要有两种:条件语句和循环语…

    Java 2023年5月23日
    00
  • Java图形化界面设计之容器(JFrame)详解

    Java图形化界面设计之容器(JFrame)详解 1. 容器的概念 在Java图形化界面设计中,容器指的是能够包含其他可视组件(如按钮、文本框等)的组件。容器可以是顶层容器(如JFrame、JDialog等)或内部容器(如JPanel、JTabbedPane等)。 JFrame是一个非常常用的顶层容器,它是Java AWT中的Frame类的一个子类,在Swi…

    Java 2023年5月23日
    00
  • MyBatisPlus的简介及案例详解

    MyBatisPlus的简介及案例详解 MyBatisPlus简介 MyBatisPlus是一个基于MyBatis的增强工具库,通过简化开发、提高效率的方式来增强MyBatis的功能。MyBatisPlus提供了很多实用的功能,包括但不限于分页、逻辑删除、自动填充、注入器、代码生成器等等。 MyBatisPlus案例详解 示例1:使用分页功能 MyBatis…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部