c语言编程笔录

首页 >   > 笔记大全

笔记大全

SpringBoot怎么使用druid配置多数据源

更新时间:2023-10-29
在实际的应用开发中,经常需要使用多数据源来连接不同的数据库,使得不同的业务逻辑模块可以独立使用不同的数据库,提高系统性能和安全性。SpringBoot提供了很多支持多数据源的方案,其中使用druid连接池和SpringJdbcTemplates来实现多数据源连接是一个比较常见的方案。下面将介绍如何在SpringBoot中使用druid连接池来配置多数据源。

1. 配置多数据源

在使用多数据源之前,需要先在application.yml中添加多个数据源的配置信息,如下所示:

spring:
  datasource:
    master:
      url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
    slave:
      url: jdbc:mysql://localhost:3306/db_slave?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
在这个配置文件中,我们定义了两个数据源,一个是master,一个是slave,分别对应着两个不同的数据库。同时,我们还需要在SpringBoot的配置文件中配置druid连接池的相关信息,如下所示:
spring:
  datasource:
    druid:
      master:
        initial-size: 5
        min-idle: 5
        max-active: 20
        test-on-borrow: true
        password: 123456
        test-while-idle: true
        validation-query: SELECT 1
        filters: stat,wall,log4j
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true
      slave:
        initial-size: 5
        min-idle: 5
        max-active: 20
        test-on-borrow: true
        password: 123456
        test-while-idle: true
        validation-query: SELECT 1
        filters: stat,wall,log4j
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db_slave?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&allowMultiQueries=true
在这个配置文件中,我们定义了两个数据源的druid连接池的参数,包括最小连接数、最大连接数、连接检查等参数,以及数据库的url、用户名和密码等信息。通过这个配置,我们就完成了多数据源和druid连接池的配置,下面可以看一下代码实现。

2. 实现多数据源连接

为了实现多数据源连接,我们需要创建一个动态数据源类DynamicDataSource,并继承AbstractRoutingDataSource类,然后重写determineCurrentLookupKey方法,根据业务逻辑的需求来判断使用哪一个数据源进行连接。代码实现如下所示:

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }

    @Override
    protected DataSource determineTargetDataSource() {
        return super.determineTargetDataSource();
    }

    public void setTargetDataSources(Map targetDataSources) {
        super.setTargetDataSources(targetDataSources);
    }

    public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
        super.setDefaultTargetDataSource(defaultTargetDataSource);
    }
}
在这个代码中,我们需要引入DataSourceContextHolder类,用来保存当前使用的数据源的key。DataSourceContextHolder类中的getDataSource方法用来获取当前线程使用的数据源的key,setDataSource方法用来设置当前线程使用的数据源的key。使用ThreadLocal变量来保存当前线程使用的数据源的key,保证线程之间不会相互影响。

3. 配置多数据源访问

使用了druid连接池和DynamicDataSource动态数据源,下面就可以实现多数据源的访问了。在使用多数据源过程中,要使用@Transactional注解来标注事务,在每一次操作数据之前,我们需要调用setDataSource方法来设置当前线程使用的数据源的key,同时在每一次操作数据之后,需要进行重置,以确保数据源的正确性。代码实现如下所示:

@Service
@Transactional
public class SqlServiceImpl implements SqlService {

    @Autowired
    private DynamicDataSource dynamicDataSource;

    @Override
    public int updateMaster(String sql) {
        DataSourceContextHolder.setDataSource("master");
        int result = 0;
        try (Connection conn = dynamicDataSource.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)){
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DataSourceContextHolder.clearDataSource();
        }
        return result;
    }

    @Override
    public int updateSlave(String sql) {
        DataSourceContextHolder.setDataSource("slave");
        int result = 0;
        try (Connection conn = dynamicDataSource.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)){
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DataSourceContextHolder.clearDataSource();
        }
        return result;
    }
}
在这个代码中,我们使用了注入的DynamicDataSource来获取数据库连接,使用setDataSource方法来设置当前线程使用的数据源的key,然后再根据业务逻辑进行操作,最后在finally代码段中调用clearDataSource方法清空数据源,保证下一次使用时的正确性。

4. 总结

多数据源连接以及druid连接池是SpringBoot中比较常见的技术方案,为应用系统提供了多样的业务逻辑和资源访问支持。在使用多数据源过程中,需要设计和编写动态数据源,同时在每次操作数据之前需要设置当前线程使用的数据源,以确保系统的正确性和高可靠性。同时,在使用druid连接池时,还要关注连接池的参数以及相关配置,尽可能提高连接的效率和安全性。