springboot配置多数据源-Dynamic
作者:互联网
配置
spring:
datasource:
dynamic:
druid: #以下是全局默认值,可以全局更改
#监控统计拦截的filters
filters: stat
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
stat:
merge-sql: true
log-slow-sql: true
slow-sql-millis: 3000
# 配置默认数据源
primary: master
strict: false
datasource:
# 数据源1,名为 master
master:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/resource?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源2,名为 readbase
readbase:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源3,名为 writebase
writebase:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/user_info?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
数据源名称最好不要包含下滑线,下滑线的数据源切换不了
primary: master
配置后,全局默认master
主数据源,只要没有@DS
注解显式申明切换数据源,默认就是master主数据源。
使用
@DS
可以注解在方法上、类上、接口、枚举,同时存在方法注解优先于类上注解。
@DS("readbase")
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
建议在
service
类中使用,不建议在mapper
上面使用解决事务内不能切换数据源:可以在被调用方方法或者类上创建一个新事务
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
外部事务回滚,内部不会回滚,内部回滚,外部事务会回滚。如果调用方与被调用方在同一个
Service
类中,propagation = Propagation.REQUIRES_NEW
会被忽略掉,调用时不会再创建新事务。
注意的问题
一:涉及需要切换数据源时
1.不能使用事务,否则数据源不会切换,使用的还是是第一次加载的数据源 。
删除 操作多数据源的方法或者类、接口 上的 注解 @Transactional() 即可。
2.第一次加载的数据源之后,第二次(第三次...)操作其它数据源,如果数据源不存在,使用的还是第一
次加载的数据源
3.数据源名称最好不要包含下滑线,下滑线的数据源切换不了
二:其他
1.接口中A、B两个方法,A无@Transactional标签,B有,上层通过A间接调用B,此时事务不生效。
2.接口中异常(运行时异常)被捕获而没有被抛出。
默认配置下,spring 只有在抛出的异常为运行时 unchecked 异常时才回滚该事务,
也就是抛出的异常为RuntimeException 的子类(Errors也会导致事务回滚),
而抛出 checked 异常则不会导致事务回滚 。可通过 @Transactional rollbackFor进行配置。
3.多线程下事务管理因为线程不属于 spring 托管,故线程不能够默认使用 spring 的事务,
也不能获取spring 注入的 bean 。
在被 spring 声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。
一个使用了@Transactional 的方法,如果方法内包含多线程的使用,方法内部出现异常,
不会回滚线程中调用方法的事务。
springboot执行sql脚本文件
创建脚本
在项目的resource 目录下新建一个sql目录, 用于存放建表语句
然后在sql 目录下创建 xxx-schema.sql, xxx-data.sql 脚本. 需要注意区分每个后缀代表的含义:
schema: 代表存放的是DDL(数据库定义语言): 对表结构的增删改在这里
data: 代表存放的是DML(数据库操作语言): 对表中数据的操作在这里
配置
-
.properties
# 需要加上这句,否则不会自动执行sql文件 spring.datasource.initialization-mode=always # schema.sql中一般存放的是建表语句DDL spring.datasource.schema = classpath:/sql/xxx-schema.sql # data.sql中一般存放的是需要插入更新等sql语句DML spring.datasource.data = classpath:/sql/xxx-data.sql # 遇到错误继续执行 spring.datasource.data.continue-on-error: true
-
.yml
spring:
datasource:
initialization-mode: always
schema:
- classpath:/sql/xxx-schema.sql
data:
- classpath:/sql/xxx-data.sql
continue-on-error: true
因为在没有加上这个配置之前, 每次初始化都会执行一遍配置的SQL脚本内的SQL语句.
如果在第一次启动并建表成功后再次重启就会因项目在启动时执行SQL脚本并出现表已存在的错误导致项目启动失败
添加该属性之后, 则会忽略错误, 让项目初始化成功! 这样, 也符合我们想要在项目初始化的时候自动执行SQL脚本的思想
sql脚本
USE `user_info`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
CREATE TABLE IF NOT EXISTS `t_user` (
`id` varcher(32) NOT NULL COMMENT '主键',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`del_flag` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志',
`username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
参考链接:
https://blog.csdn.net/LittleBlackyoyoyo/article/details/109379791
https://blog.csdn.net/qq_43371556/article/details/122976456
标签:回滚,false,springboot,spring,数据源,Dynamic,sql,true 来源: https://www.cnblogs.com/2393920029-qq/p/16394009.html