• springboot 使用多数据源 + 多事务管理器


    背景

    公司项目需要用到多个数据源,因为数据来源于不同的系统,所以这里简单描述下 springboot多数据源如何配置与使用, 以及涉及到 多事务管理器如何配置与使用

    springboot 配置文件

    spring:
      datasource:
        bigdata:
          driver-class-name: com.mysql.jdbc.Driver
          url: yoururl
          username: username
          password: root
        jx:
          driver-class-name: com.mysql.jdbc.Driver
          url: yoururl
          username: username
          password: root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在yml配置文件中 填写好自己的两个数据源连接信息

    mybatis 配置文件

    mybatis-config.xml

    
    DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        
        <settings>
            
            <setting name="logImpl" value="STDOUT_LOGGING" />
            
    
            
            <setting name="cacheEnabled" value="true"/>
    
            
            <setting name="lazyLoadingEnabled" value="true"/>
    
            
            <setting name="aggressiveLazyLoading" value="true"/>
    
            
            <setting name="multipleResultSetsEnabled" value="true"/>
    
            
            <setting name="useColumnLabel" value="true"/>
    
            
            <setting name="useGeneratedKeys" value="false"/>
    
            
            <setting name="autoMappingBehavior" value="PARTIAL"/>
    
            
            <setting name="defaultExecutorType" value="SIMPLE"/>
    
            
            <setting name="mapUnderscoreToCamelCase" value="true"/>
    
            
            <setting name="localCacheScope" value="STATEMENT"/>
    
            
            <setting name="jdbcTypeForNull" value="NULL"/>
    
    
        settings>
    
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageHelper">
                <property name="dialect" value="mysql"/>
                <property name="supportMethodsArguments" value="true"/>
                <property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/>
            plugin>
        plugins>
        
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • settings 里面包含了一些简单的设置 ,这些设置基本写了注释,可以详细看下,可以选择性加一些
    • plugins 里面加入了 分页插件,用的是 github开源的插件, 挺好用的,也可以自己写。 自己的写的话可以增加一些特性啥的,具体可以百度,不再赘诉。

    编写jdbc配置类

    这里为了便于识别,将两个数据源的配置放在了两个configure中

    @Configuration
    @MapperScan(basePackages = BigdataDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "bigdataSqlSessionFactory")
    public class BigdataDataSourceConfig {
    
        static final String PACKAGE = "xxxxxxxx";
        static final String MAPPER_LOCATION = "xxxxxxxx";
    
        @Value("${spring.datasource.bigdata.url}")
        private String url;
    
        @Value("${spring.datasource.bigdata.username}")
        private String user;
    
        @Value("${spring.datasource.bigdata.password}")
        private String password;
    
        @Value("${spring.datasource.bigdata.driver-class-name}")
        private String driverClass;
    
        @Value("${mybatis.config-location}")
        private String configLocation;
    
        @Value("${mybatis.mapper-locations}")
        private String mapperLocations;
    
        @Value("${mybatis.type-aliases-package}")
        private String typeAliasesPackage;
    
        @Bean(name = "bigdataDataSource")
        @Primary
        public DataSource bigdataDataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(driverClass);
            dataSource.setUrl(url);
            dataSource.setUsername(user);
            dataSource.setPassword(password);
            return dataSource;
        }
    
        @Bean(name = "bigdataTransactionManager")
        @Primary
        public DataSourceTransactionManager bigdataTransactionManager() {
            return new DataSourceTransactionManager(bigdataDataSource());
        }
    
        @Bean(name = "bigdataSqlSessionFactory")
        @Primary
        public SqlSessionFactory bigdataSqlSessionFactory(@Qualifier("bigdataDataSource") DataSource bigdataDataSource)
                throws Exception {
            final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    
            sessionFactory.setDataSource(bigdataDataSource);
            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(BigdataDataSourceConfig.MAPPER_LOCATION));
    
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            //设置 mybatis配置, 不然mybatis配置文件里面配置的东西无法生效
            sessionFactory.setConfigLocation(resolver.getResource(configLocation));
            sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
    
            return sessionFactory.getObject();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    注意点
    1. PACKAGE : *mapper.java 类所在的包路径
    2. MAPPER_LOCATION : *mapper.xml 所在的包路径 我这里是 classpath:mapper/bigdata/*.xml
    3. sessionFactory.setConfigLocation(resolver.getResource(configLocation)); 加载 自己编写的mybatis 配置类,不然设置的那些参数,以及分页插件不会生效。 (比如 *mapper.xml 查询结果不会自动将下划线转驼峰并映射到 java entity类的字段上, 一般出现这种情况,要么就是 mybatis-config.xml 里面settings没有设置该项, 要么就是没有加载到 mybatis配置文件)
    4. @Bean(name = "bigdataTransactionManager") 这里是设置这个数据源的 事务管理器, 所有通过该数据源的数据库动作都归于这个名字叫“bigdataTransactionManager”的事务管理器

    另一个数据源配置类就不贴出来了,基本配置一样 ,但是需要将数据源名称修改一下,然后上述四个注意点也需要按实际情况进行修改。

    ServiceImpl

    在ServiceImpl文件 中,我们需要使用 @Transcational() 注解来使用 事务管理器。
    但是我们实际上注册了两个, 如果不指定事务管理器的, springboot是不知道该使用那个的。
    不过我们在注册的时候,在 @Bean(name = "bigdataTransactionManager"), 这一行下面使用了 @Primary 注解。
    所以我们的spring会默认使用 bigdataTransactionManager 这个事务管理器。
    如果当你需要用到 另一个事务管理器的时候,你需要在你的 @Transcational 注解中指定事务管理器名称
    ps: 可以使用在方法上,也可以加在 serviceImpl文件最上方

    @Transactional(readOnly = true, transactionManager = "primaryTxxxxxxxxxxx")
    @Transactional(readOnly = true, transactionManager = "anotherTxxxxxxxxxx")
    
    • 1
    • 2

    总结

    Springboot帮我们做了很多事情, 但是其实明白里面的设计还是比较重要的, 至少你从0搭建一个代码框架的时候不会有太多问题。
    记录一下自己的问题,也希望能够帮助到正在学习的各位

  • 相关阅读:
    摄影网页设计制作 简单静态HTML网页作品 WEB静态摄影网站作业成品 学生DW摄影网站模板
    【免费源码下载】完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城php+uniapp
    Python的web自动化学习(三)Selenium的显性、隐形等待
    基础设施SIG月度动态:「龙蜥大讲堂」基础设施系列专题分享完美收官,容器镜像构建 2.0 版本上线
    qgis 将县区的数据转成市区的边界数据
    以深圳为例Python一键生成核酸检测日历
    【Spring Cloud】新闻头条微服务项目:环境搭建及框架准备
    【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑
    编译原理中的token简介
    【部署】Linux Shell脚本部署java程序 (jar包)
  • 原文地址:https://blog.csdn.net/qq_40309183/article/details/126832069