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