Springboot 基于 druid 的多数据源配置

本贴最后更新于 724 天前,其中的信息可能已经事过景迁

经常在开发过程中遇到多数据源操作的需求,这里记录一下 springboot 的非分布式事务操作多个数据源的配置,即这多个数据源是在不同的事务中去操作的。

主数据源配置

我们这里使用的不同的注解来划分不同的数据源。主数据源依然扫描的是 mybatis 自带的 Mapper 注解。

import javax.sql.DataSource;
import org.apache.ibatis.annotations.Mapper;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

/**
 * 数据源注入配置
 *
 * @ClassName:  DataSourceConfig
 * @author: Michael
 * @date:   2021-2-28 17:17:44
 * @since:  v1.0
 */
@Configuration
@MapperScan(basePackages = { "io.github.junxworks.ep.*", "com.yrsc.bp.*" }, annotationClass = Mapper.class, sqlSessionTemplateRef = "mainSqlSessionTemplate")
public class DataSourceConfig {

	@Bean
	@Primary
	@ConfigurationProperties("spring.datasource.druid.main")
	public DataSource mainDataSource() {
		return DruidDataSourceBuilder.create().build();
	}

	@Primary
	@Bean(name = "mainSqlSessionFactory")
	public SqlSessionFactory mainSqlSessionFactory(@Qualifier("mainDataSource") DataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		SqlSessionFactory factory = bean.getObject();
		org.apache.ibatis.session.Configuration config = factory.getConfiguration();
		config.setMapUnderscoreToCamelCase(true);
		config.setLazyLoadingEnabled(true);
		config.setDefaultStatementTimeout(300);
		return factory;
	}

	@Primary
	@Bean(name = "mainTransactionManager")
	public DataSourceTransactionManager mainTransactionManager(@Qualifier("mainDataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	@Primary
	@Bean(name = "mainSqlSessionTemplate")
	public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("mainSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

}

次数据源配置

次数据源使用的注解是自定义的 LM 注解,只要 mapper 接口上添加了 LM 注解,则走 LM 数据源。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.sql.DataSource;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.yrsc.bp.config.LmDataSourceConfig.LM;

@Configuration
@MapperScan(basePackages = { "com.yrsc.bp.*" }, annotationClass = LM.class, sqlSessionTemplateRef = "lmSqlSessionTemplate")
public class LmDataSourceConfig {

	@Bean(name = "lmDataSource")
	@ConfigurationProperties("spring.datasource.druid.lm")
	public DataSource investDataSource() {
		return DruidDataSourceBuilder.create().build();
	}

	@Bean(name = "lmSqlSessionFactory")
	public SqlSessionFactory lmSqlSessionFactory(@Qualifier("lmDataSource") DataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		SqlSessionFactory factory = bean.getObject();
		org.apache.ibatis.session.Configuration config = factory.getConfiguration();
		config.setMapUnderscoreToCamelCase(true);
		config.setLazyLoadingEnabled(true);
		config.setDefaultStatementTimeout(300);
		return factory;
	}

	@Bean(name = "lmTransactionManager")
	public DataSourceTransactionManager lmTransactionManager(@Qualifier("lmDataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	@Bean(name = "lmSqlSessionTemplate")
	public SqlSessionTemplate lmSqlSessionTemplate(@Qualifier("lmSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

	@Target(ElementType.TYPE)
	@Retention(RetentionPolicy.RUNTIME)
	@Documented
	public static @interface LM {
	}
}

Application 配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      main:  #数据服务数据源
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://dburl/test?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull
        username: test
        password: "test"
        initial-size: 1
        max-active: 100
        min-idle: 1
        max-wait: 60000
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        validation-query: SELECT 1
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
      lm:  #数据服务数据源
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://dburl/lmtest?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull
        username: lmtest
        password: "lmtest"
        initial-size: 1
        max-active: 100
        min-idle: 1
        max-wait: 60000
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        validation-query: SELECT 1
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
      #下一个数据源
      #公共参数
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        #login-username: admin
        #login-password: admin
      filter:
        stat:
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...