Springboot 基于 druid 的多数据源配置

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

经常在开发过程中遇到多数据源操作的需求,这里记录一下 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 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖

相关帖子

欢迎来到这里!

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

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