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

本文详细解析了如何在Java项目中使用SpringBoot、Druid、Atomikos实现多数据源的事务管理,包括AOP动态切换数据源、配置XATransaction和自定义SqlSessionTemplate。附带实战项目源码和面试题解析,助力技术求职者提升面试准备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

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 :

**/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值