SpringBoot集成Druid连接多个数据源

在实际项目中,一个微服务需要与多个不同的数据库进行交互。使用 Druid 作为连接池,有助于提高数据源的性能和可靠性。通过这种方式,微服务可以在数据库或数据集群之间保持高效的交互,实现更复杂的业务逻辑。

1. 引入依赖

xml 复制代码
<!--   多数据源连接池     -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.21</version>
 </dependency>

2. 连接配置

java 复制代码
spring:
  datasource:
    test1:
      jdbc-url: jdbc:mysql://localhost:3306/demo?setUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 123456
      initialSize: 10
      minIdle: 30
      maxActive: 30
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000

3. 多数据源配置类

getResources("classpath:mapper/test1/*.xml") 中数据源test1会自动扫描test1文件夹下面的所有mapper.xml文件

java 复制代码
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
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 = {"cn.cjc.mapper.test1"}, sqlSessionFactoryRef = "test1SqlSessionFactory")
public class Test1DataSourceConfig {

    @Value("${spring.datasource.test1.jdbc-url}")
    private String url;
    @Value("${spring.datasource.test1.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.test1.username}")
    private String username;
    @Value("${spring.datasource.test1.password}")
    private String password;
    @Value("${spring.datasource.test1.initialSize}")
    private int initialSize;
    @Value("${spring.datasource.test1.minIdle}")
    private int minIdle;
    @Value("${spring.datasource.test1.maxActive}")
    private int maxActive;
    @Value("${spring.datasource.test1.maxWait}")
    private int maxWait;
    @Value("${spring.datasource.test1.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.test1.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;

    @Bean(name = "test1DataSource")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setInitialSize(initialSize);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxActive(maxActive);
        dataSource.setMaxWait(maxWait);
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        dataSource.setValidationQuery("select 1");
        dataSource.setTestWhileIdle(true);
        return dataSource;
    }

    @Bean(name = "test1SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test1/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "test1TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test1SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
相关推荐
Chenyiax3 分钟前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH5 分钟前
Koa和Express的区别
后端
MariaH10 分钟前
Koa框架的使用
后端
luckdewei1 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某3 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy3 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom3 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
唐青枫7 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
用户1474853079747 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1237 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端