千家信息网

SpringBoot多数据源集成的方法

发表于:2024-10-14 作者:千家信息网编辑
千家信息网最后更新 2024年10月14日,这篇文章主要介绍了SpringBoot多数据源集成的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot多数据源集成的方法文章都会有所收获,下面我们一起
千家信息网最后更新 2024年10月14日SpringBoot多数据源集成的方法

这篇文章主要介绍了SpringBoot多数据源集成的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot多数据源集成的方法文章都会有所收获,下面我们一起来看看吧。

    一、多数据源使用场景与弊端

    1.场景

    • 业务系统跨数据库

    • 数据转存(这个现在太low了,应该高级点都不用)

    • 系统集成

    2.弊端

    • 跨库业务事务问题

    • service、dao不能重复注入数据源

    二、使用步骤

    1.引入库

              com.baomidou      dynamic-datasource-spring-boot-starter      3.3.6    

    2.多数据源配置文件

    #数据源配置
    spring:
    application:
    name: olap
    datasource:
    dynamic:
    primary: target
    target:
    jdbc-url: jdbc:mysql://192.168.1.101:15051/db1?useUnicode=true&characterEncoding=utf8&useSSL=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
    source1:
    jdbc-url: jdbc:mysql://192.168.102:15052/db2?useUnicode=true&characterEncoding=utf8&useSSL=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
    username: admin
    password: 456
    driver-class-name: com.mysql.jdbc.Driver

    3.多数据源配置类

    数据源1

    import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.PlatformTransactionManager;@Configuration@MapperScan(basePackages = "com.easylinkin.dc.mapper.source1", sqlSessionFactoryRef = "source1SqlSessionFactory")public class Source1DataSourceConfig {  // mapper.xml所在地址  private static final String MAPPER_LOCATION = "classpath*:mapper/business/source1/*.xml";  /**   * 数据源   */  @Bean(name = "source1DataSource")  @ConfigurationProperties(prefix = "spring.datasource.source1")  public DataSource dataSource() {    DataSource build = DataSourceBuilder.create().build();    return build;  }  /**   * 事务管理器   */  @Bean(name = "source1TransactionManager")  public PlatformTransactionManager dataSourceTransactionManager(      @Qualifier("source1DataSource") DataSource dataSource) {    return new DataSourceTransactionManager(dataSource);  }  /**   * session工厂   */  @Bean(name = "source1SqlSessionFactory")  public SqlSessionFactory sqlSessionFactory(@Qualifier("source1DataSource") DataSource dataSource)      throws Exception {  /*  final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();    sessionFactoryBean.setDataSource(dataSource);    sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(        Source1DataSourceConfig.MAPPER_LOCATION));*/    //不使用下面这个无法使用mybatis-plus提供的BaseMapper中的方法,需要增加mybatis-plus 的拓展依赖    MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();    bean.setDataSource(dataSource);    //不在这里注入分页插件,会失效    //bean.setPlugins(new PaginationInterceptor[]{new PaginationInterceptor()});    return bean.getObject();  }}

    数据源2

    import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.PlatformTransactionManager;@Configuration@MapperScan(basePackages = "com.easylinkin.dc.mapper.target", sqlSessionFactoryRef = "targetSqlSessionFactory")public class TargetDataSourceConfig {  // mapper.xml所在地址  private static final String MAPPER_LOCATION = "classpath*:mapper/business/target/*.xml";  /**   * 主数据源,Primary注解必须增加,它表示该数据源为默认数据源 项目中还可能存在其他的数据源,如获取时不指定名称,则默认获取这个数据源,如果不添加,则启动时候回报错   */  @Primary  @Bean(name = "targetDataSource")  @ConfigurationProperties(prefix = "spring.datasource.target")  public DataSource dataSource() {    DataSource build = DataSourceBuilder.create().build();    return build;  }  /**   * 事务管理器,Primary注解作用同上   */  @Bean(name = "masterTransactionManager")  @Primary  public PlatformTransactionManager dataSourceTransactionManager(      @Qualifier("targetDataSource") DataSource dataSource) {    return new DataSourceTransactionManager(dataSource);  }  /**   * session工厂,Primary注解作用同上   */  @Bean(name = "targetSqlSessionFactory")  @Primary  public SqlSessionFactory sqlSessionFactory(@Qualifier("targetDataSource") DataSource dataSource)      throws Exception {    /*final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();    sessionFactoryBean.setDataSource(dataSource);    sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(        TargetDataSourceConfig.MAPPER_LOCATION));    return sessionFactoryBean.getObject();*/    //不使用下面这个无法使用mybatis-plus提供的BaseMapper中的方法,需要增加mybatis-plus 的拓展依赖    MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();    bean.setDataSource(dataSource);    //不在这里注入分页插件,会失效    //bean.setPlugins(new PaginationInterceptor[]{new PaginationInterceptor()});    return bean.getObject();  }}
    • 注意dao一定要在@MapperScan注解设置的包下

    • 注意xml文件要在MAPPER_LOCATION=的路径下

    • springBoot启动类不要再用@MapperScan注解

    • 其他注意配置类的SqlSessionFactory 方法,看注释

    4.使用

    import com.baomidou.dynamic.datasource.annotation.DS;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.easylinkin.dc.common.exceptions.BusinessException;import com.easylinkin.dc.common.utils.io.OutputStreamUtil;import com.easylinkin.dc.mapper.source1.FkRegisterVisitorMapper;import com.easylinkin.dc.business.visitor.entity.FkRegisterVisitor;import com.easylinkin.dc.business.visitor.entity.vo.FkRegisterVisitorVo;import com.easylinkin.dc.business.visitor.service.FkRegisterVisitorService;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.ObjectUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.stereotype.Repository;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import org.springframework.util.Assert;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.OutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.List;/** * FkRegisterVisitor表服务实现类 * * @author CodeGenerator * @date 2022/05/16 */@DS("source1")@Slf4j@Service("fkRegisterVisitorService")public class FkRegisterVisitorServiceImpl extends ServiceImpl     implements FkRegisterVisitorService {    }

    注意是在service的实现类上用@DS("数据源名称")注解,数据源名称与配置文件里的datasource下的一致。

    注意dao不能再用@DS注解,否在报错

    关于"SpringBoot多数据源集成的方法"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"SpringBoot多数据源集成的方法"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

    数据 数据源 方法 注解 配置 事务 名称 文件 知识 业务 事务管理 作用 内容 地址 场景 工厂 弊端 所在 插件 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 宜兴口碑好的网络技术联系方式 中国怎样增加根服务器 音乐软件开发者 广东常规软件开发口碑推荐 失踪dna数据库 网络技术部对企业的重要性 最好的软件开发平台 抚州梦巢互联网科技有限公司 湖北多功能软件开发厂家价格 宁波嘉旺牛网络技术有限公司 软件开发测试工程师运维工程师 网络安全自主可控公司 网络安全伴生品 计算机网络技术的分支 漯河网络安全宣传周活动有声有色 公安局网络安全与执法试题 社保中间数据库的导出 杭州维特猫网络技术 文件复制到ftp服务器发现错误 怎样学网络技术不枯燥 西安工业大学网络安全学院 杞睿网络技术有限公司 网络安全时代划分 芮锶钶网络技术 街道网络安全计划 日本最大的服务器 华为将网络安全作为公司最高纲领 华勤通讯软件开发笔试题 杭州艾达特互联网科技有限公司 元数据获取所有数据库名称
    0