SpringBoot+Druid+Mybatis多数据源动态切换

Spring原生支持多数据源动态切换,继承AbstractRoutingDataSource类重写determineCurrentLookupKey方法即可,为了方别切换可通过切面拦截自定义注解实现,代码如下:1、SpringBoot使用Druid配置多数据源spring: #出现错误时, 直接抛出异常(便于异常统一处理,否则捕获不到404) mvc: throw-except...
摘要由CSDN通过智能技术生成

Spring原生支持多数据源动态切换,继承AbstractRoutingDataSource类重写determineCurrentLookupKey方法即可,为了方便切换可通过切面拦截自定义注解实现,代码如下:
1、SpringBoot使用Druid配置多数据源

spring:
  #出现错误时, 直接抛出异常(便于异常统一处理,否则捕获不到404)
  mvc:
    throw-exception-if-no-handler-found: true
    view:
      prefix: classpath:/static/
      suffix: .html
    static-path-pattern: /**

  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/templates/

  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    encoding: utf-8
    cache: false
    mode: LEGACYHTML5
    enabled: true

  http:
    encoding:
      force: true
      charset: UTF-8
      force-request: true
      enabled: true
  datasource:
    #配置DruidDatasouce连接池
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      #连接数据库
      driver-class-name: oracle.jdbc.driver.OracleDriver
      #druid配置详情信息
      max-active: 100  #最大连接数
      initial-size: 1  #初始化连接数
      max-wait: 60000  #获取最大等待时间
      min-idle: 1 #最小连接数
      validation-query: select * from dual
      time-between-eviction-runs-millis: 60000   #一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 300000     #间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      pool-prepared-statements: false            #是否缓存preparedStatement 在mysql的环境下建议关闭 因为对数据库性能消耗大
      max-open-prepared-statements: 50
      max-pool-prepared-statement-per-connection-size: 20
      filters: stat,wall #配置监控统计拦截的filters,去掉后监控界面SQL无法进行统计,'wall'用于防火墙
      stat-view-servlet:
        url-pattern: /druid/*

      druidDataSource1:
        url: jdbc:oracle:thin:@localhost:1521:orcl
        username: rim
        password: rim

      druidDataSource2:
        url: jdbc:oracle:thin:@localhost:1521:orcl
        username: rim
        password: rim

      druidDataSource3:
        url: jdbc:oracle:thin:@localhost:1521:orcl
        username: rim
        password: rim

2、用于声明数据源的自定义注解TargetDataSource

package com.bsoft.core.datasource;

import com.bsoft.commons.constant.DataSourceKey;

import java.lang.annotation.*;

/**
 * @author :Liujian
 * @date :2019/11/15 16:48
 * @description:自定义DataSource注解
 * @version:
 */
@Target({
   ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TargetDataSource {
   

    DataSourceKey value() default DataSourceKey.FIRST;
}

3、定义继承AbstractRoutingDataSource类重写determineCurrentLookupKey方法用于实现数据源动态切换

package com.bsoft.core.datasource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @author :Liujian
 * @date :2019/11/15 16:48
 * @description:动态切换数据源
 * @version:
 */
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
   

    /**
     * 获取与数据源相关的key
     * 此key是Map<String, DataSource> resolvedDataSources 中与数据源绑定的key值
     * 在通过determineTargetDataSource获取目标数据源时使用
     */
    @Override
    protected Object determineCurrentLookupKey() {
   
        return DynamicDataSourceHolder.getDataSourceRouterKey();
    }
}

4、定义数据源的连接字符串线程绑定DynamicDataSourceHolder

package com.bsoft.core.datasource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * @author :Liujian
 * @date :2019/11/15 16:48
 * @description:动态切换数据源
 * @version:
 */
public class DynamicDataSourceHolder {
   

    private static Logger logger = LoggerFactory.getLogger(DynamicDataSourceHolder.class);

    /**
     * 存储已经注册的数据源的key
     */
    public static final List<Object> dataSourceKeys = new ArrayList<>();

    /**
     * 线程级别的私有变量
     */
    private static final ThreadLocal<String> HOLDER = new ThreadLocal<>(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于快速构建 Java 应用程序的框架。它可以与多种其他框架和组件进行整合,以实现更丰富的功能。在这里,我们将讨论如何使用 Spring Boot 整合 DruidMyBatis、JTA 分布式事务以及多数据源,同时使用 AOP 注解实现动态切换。 首先,我们可以在 Spring Boot 中集成 Druid 数据源Druid 是一个高性能的 JDBC 连接池,可以提供监控和统计功能。我们可以通过在 pom.xml 文件中添加相关的依赖,并在 application.properties 文件中配置数据源信息,来实现 Druid 的集成。 接下来,我们可以整合 MyBatis 框架,它是一种优秀的持久化解决方案。我们可以使用 MyBatis 来操作数据库,并将其与 Druid 数据源进行整合。为此,我们需要在 pom.xml 文件中添加 MyBatisMyBatis-Spring 的依赖,并配置 MyBatis 的相关配置文件。 此外,我们还可以使用 JTA(Java Transaction API)实现分布式事务。JTA 可以在分布式环境中协调多个参与者的事务操作。我们可以在 pom.xml 文件中添加 JTA 的依赖,并在 Spring Boot 的配置文件中配置 JTA 的相关属性,以实现分布式事务的支持。 在实现多数据源时,我们可以使用 Spring Boot 的 AbstractRoutingDataSource 来实现动态切换数据源。这个类可以根据当前线程或其他条件选择不同数据源来进行数据操作。我们可以通过继承 AbstractRoutingDataSource 并实现 determineCurrentLookupKey() 方法来指定当前数据源的 key。然后,在配置文件中配置多个数据源,并将数据源注入到 AbstractRoutingDataSource 中,从而实现动态切换。 最后,我们可以使用 AOP(Aspect Oriented Programming)注解来实现动态切换。AOP 是一种编程范式,可以通过在代码中插入特定的切面(Aspect)来实现横切关注点的处理。我们可以在代码中使用注解来标记需要切换数据源的方法,然后使用 AOP 技术来拦截这些方法,并根据注解中指定的数据源信息来进行数据源切换。 综上所述,通过整合 DruidMyBatis、JTA 分布式事务以及多数据源,并使用 AOP 注解实现动态切换,我们可以在 Spring Boot 中实现强大而灵活的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值