Springboot 整合druid+mybatis+jta分布式事务+多数据源aop注解动态切换 (一篇到位)

本文详细介绍了如何在Springboot项目中整合Druid数据源、Mybatis、JTA(Atomikos)以实现分布式事务,并动态切换多个数据源。配置包括数据源初始化、连接池参数、WebStatFilter和StatViewServlet,以及AOP注解方式的动态数据源切换。文章提供了完整的配置代码和关键类的实现,包括自定义注解、数据源工厂、会话工厂及SqlSessionTemplate的定制。
摘要由CSDN通过智能技术生成

org.springframework.boot

spring-boot-starter-jta-atomikos

org.projectlombok

lombok

1.16.10

mysql

mysql-connector-java

6.0.6

com.alibaba

druid-spring-boot-starter

1.1.9

org.springframework.boot

spring-boot-starter-aop

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.0

org.springframework.boot

spring-boot-starter-test

test

然后是数据源的yml信息,application.yml:

server:

port: 8077

spring:

application:

name: jta-dbsource

datasource:

druid:

mydbone:

url: jdbc:mysql://localhost:3306/mydbone?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&pinGlobalTxToPhysicalConnection=true&autoReconnect=true

username: root

password: root

driver-class-name: com.mysql.cj.jdbc.Driver

初始化时建立物理连接的个数。初始化发生在显示调用 init 方法,或者第一次 getConnection 时

initialSize: 5

最小连接池数量

minIdle: 5

最大连接池数量

maxActive: 10

获取连接时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 useUnfairLock 属性为 true 使用非公平锁。

maxWait: 60000

Destroy 线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接。

timeBetweenEvictionRunsMillis: 60000

连接保持空闲而不被驱逐的最小时间

minEvictableIdleTimeMillis: 300000

用来检测连接是否有效的 sql 因数据库方言而异, 例如 oracle 应该写成 SELECT 1 FROM DUAL

validationQuery: SELECT 1

建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连接是否有效。

testWhileIdle: true

申请连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。

testOnBorrow: false

归还连接时执行 validationQuery 检测连接是否有效,做了这个配置会降低性能。

testOnReturn: false

是否自动回收超时连接

removeAbandoned: true

超时时间 (以秒数为单位)

remove-abandoned-timeout: 1800

logAbandoned: true

pinGlobalTxToPhysicalConnection: true

mydbtwo:

url: jdbc:mysql://localhost:3306/mydbtwo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&pinGlobalTxToPhysicalConnection=true&autoReconnect=true

username: root

password: root

driver-class-name: com.mysql.cj.jdbc.Driver

initialSize: 6

minIdle: 6

maxActive: 10

maxWait: 60000

timeBetweenEvictionRunsMillis: 60000

minEvictableIdleTimeMillis: 300000

validationQuery: SELECT 1

testWhileIdle: true

testOnBorrow: false

testOnReturn: false

removeAbandoned: true

remove-abandoned-timeout: 1800

logAbandoned: true

pinGlobalTxToPhysicalConnection: true

WebStatFilter 用于采集 web-jdbc 关联监控的数据。

web-stat-filter:

是否开启 WebStatFilter 默认是 true

enabled: true

需要拦截的 url

url-pattern: /*

排除静态资源的请求

exclusions: “.js,.gif,.jpg,.png,.css,.ico,/druid/*”

Druid 内置提供了一个 StatViewServlet 用于展示 Druid 的统计信息。

stat-view-servlet:

#是否启用 StatViewServlet 默认值 true

enabled: true

需要拦截的 url

url-pattern: /druid/*

允许清空统计数据

reset-enable: true

login-username: myname

login-password: mypwd

-----接下来就是代码环节-----

========================

大家多注意看注释,很多关键信息都用注释方式进行了简明的介绍:


先创建一个自定义注解,DataSource.java:

import java.lang.annotation.*;

/**

  • @Author : JCccc

  • @CreateTime : 2019/8/28

  • @Description :

**/

@Documented

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public @interface DataSource {

String value() default DataSourceNames.ONE;

}

然后是创建 DataSourceNames.java,用于简单数据源命名:

/**

  • @Author : JCccc

  • @CreateTime : 2019/8/28

  • @Description :

**/

public interface DataSourceNames {

String ONE = “ONE”;

String TWO = “TWO”;

}

ps:其实这些都是我之前aop切换数据源的时候敲的,大概8月份的时候,这次我相当于在这个基础上着重解决事务问题

然后是将自定义注解作为切点,进行aop方式动态切换逻辑补全,创建DynamicDataSourceAspect.java:

import com.test.jtadbsource.dbCo

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值