多数据源动态切换 自定义注解方式

本文介绍了如何在Java中通过自定义注解和AOP切面实现多数据源的动态切换。利用ThreadLocal保证线程间数据隔离,确保每个线程可以独立操作不同的数据源。详细步骤包括:定义切面匹配数据源注解,获取注解中的数据库信息,设置ThreadLocal变量,以及使用AbstractRoutingDataSource实现动态数据源切换。此外,还涉及了数据源配置、枚举类型和多数据源处理的相关内容。
摘要由CSDN通过智能技术生成

1、通过切面的方式进行数据源的切换;切的是 注解@DataSoure;@Pointcut("@annotation(com.manage.common.annotation.DataSource)"
            + "|| @within(com.manage.common.annotation.DataSource)")

2、然后切面获取当前的方法的注解中所要切换的数据库

3、设置数据源的变量ThreadLocal<String> CONTEXT_HOLDER.set(dsType); (

什么是ThreadLocal  

ThreadLocal是java中的线程本地变量,用于每个线程保存自己的变量,使线程间的变量互不干扰。

使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,

所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

4、使用 AbstractRoutingDataSource实现动态数据源切换

1.定义DynamicDataSource类继承抽象类AbstractRoutingDataSource,并实现了determineCurrentLookupKey()方法。

2.把配置的多个数据源会放在AbstractRoutingDataSource的 targetDataSources和defaultTargetDataSource中,然后通过afterPropertiesSet()方法将数据源分别进行复制到resolvedDataSources和resolvedDefaultDataSource中。

3.调用AbstractRoutingDataSource的getConnection()的方法的时候,先调用determineTargetDataSource()方法返回DataSource在进行getConnection()。
 

数据源配置 这里用的是postgresql

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    druid:
      # 主库数据源
      system:
        url: jdbc:postgresql://192....207:12004/db_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
      # 从库数据源
      template:
        # 从数据源开关/默认关闭/captchaImage
        enabled: true
        url: jdbc:postgresql://192....207:12004/db_work_template?autoReconnect=true&&useSSL=true
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
        # 从库数据源
      log:
        # 从数据源开关/默认关闭/captchaImage
        enabled: true
        url: jdbc:postgresql://192....207:12004/db_work_log?autoReconnect=true&&useSSL=true
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
      # 从库数据源
      event:
        # 从数据源开关/默认关闭/captchaImage
        enabled: true
        url: jdbc:postgresql://192....207:12004/db_work_event?autoReconnect=true&&useSSL=true
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
      # 从库数据源
      statis:
        # 从数据源开关/默认关闭/captchaImage
        enabled: true
        url: jdbc:postgresql://192....207:12004/db_work_statis?autoReconnect=true&&useSSL=true
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
      # 从库数据源
      allelism:
        # 从数据源开关/默认关闭/captchaImage
        enabled: true
        url: jdbc:postgresql://192....207:12004/db_allelism?autoReconnect=true&&useSSL=true
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
        # 从库数据源
      activiti:
        # 从数据源开关/默认关闭/captchaImage
        enabled: true
        url: jdbc:postgresql://192....207:12004/db_activiti?autoReconnect=true&&useSSL=true
        username: postgres
        password: DB$zs#H9KhA$t.....z%THI%q4^PYS
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictabl
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值