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在这个代码中,我们需要引入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连接池时,还要关注连接池的参数以及相关配置,尽可能提高连接的效率和安全性。