其他分享
首页 > 其他分享> > springboot配置多数据源-Dynamic

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(数据库操作语言): 对表中数据的操作在这里

配置

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