Mybatis多数据源切换实现代码

 更新时间:2020年10月15日 09:31:49   作者:ayueC  
这篇文章主要介绍了Mybatis多数据源切换实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这次要完成的是从一个数据库中读取数据,然后再把数据插入到另一个数据库中。在同一套项目代码中要完成这个操作,就不可避免的涉及到了多数据源。本文即介绍在mybatis中完成多数据源的切换相关内容

指定数据源一

@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {

  // 精确到 master 目录,以便跟其他数据源隔离
  static final String PACKAGE = "com.datareach.kafka.dao.master";
  static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
	//application.yml中的值可以通过@Value注解进行读取
  @Value("${master.datasource.url}")
  private String url;
  @Value("${master.datasource.username}")
  private String user;
  @Value("${master.datasource.password}")
  private String password;
  @Value("${master.datasource.driver-class-name}")
  private String driverClass;

  @Bean(name = "masterDataSource")
  @Primary
  public DataSource masterDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driverClass);
    dataSource.setUrl(url);
    dataSource.setUsername(user);
    dataSource.setPassword(password);
    return dataSource;
  }

  @Bean(name = "masterTransactionManager")
  @Primary
  public DataSourceTransactionManager masterTransactionManager() {
    return new DataSourceTransactionManager(masterDataSource());
  }

  @Bean(name = "masterSqlSessionFactory")
  @Primary
  public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
      throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(masterDataSource);
    sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
    return sessionFactory.getObject();
  }
}

数据源一的相关配置

# master 数据源配置
master:
 datasource:
  url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
  driver-class-name: org.postgresql.Driver
  username: product
  password: 
  initial-size: 1
  min-idle: 1
  max-active: 20
  test-on-borrow: true
  max-wait: 60000
  time-between-eviction-runs-millis: 60000
  min-evictable-idle-time-millis: 300000
  validation-query: SELECT 1 FROM DUAL
  test-While-Idle: true
  test-on-return: false
  pool-prepared-statements: false
  max-pool-prepared-statement-per-connection-size: 20
  filters: stat,wall,log4j,config

指定数据源二

@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {
  // 精确到 cluster 目录,以便跟其他数据源隔离
  static final String PACKAGE = "com.datareach.kafka.dao.secondary";
  static final String MAPPER_LOCATION = "classpath:mapper/secondary/*.xml";
  @Value("${second.datasource.url}")
  private String url;
  @Value("${second.datasource.username}")
  private String user;
  @Value("${second.datasource.password}")
  private String password;
  @Value("${second.datasource.driver-class-name}")
  private String driverClass;

  @Bean(name = "secondDataSource")
  public DataSource clusterDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driverClass);
    dataSource.setUrl(url);
    dataSource.setUsername(user);
    dataSource.setPassword(password);
    return dataSource;
  }
  @Bean(name = "secondTransactionManager")
  public DataSourceTransactionManager clusterTransactionManager() {
    return new DataSourceTransactionManager(clusterDataSource());
  }
  @Bean(name = "secondSqlSessionFactory")
  public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
      throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(clusterDataSource);
    sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources(SecondDataSourceConfig.MAPPER_LOCATION));
    return sessionFactory.getObject();
  }
}

数据源二的相关配置

second:
 datasource:
  url: jdbc:mysql://localhost:40000/PG_Data?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
  username: root
  password: 
  driver-class-name: com.mysql.jdbc.Driver
  max-idle: 10
  max-wait: 10000
  min-idle: 5
  initial-size: 5

其实就是实例化了两个SqlSessionFactory——masterSqlSessionFactory和secondSqlSessionFactory,然后通过注解@MapperScan指定扫描指定的mapper接口时用指定的SqlSessionFactory进行连接构建,从而实现了多数据源。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中抽象类的作用及说明

    Java中抽象类的作用及说明

    这篇文章主要介绍了Java中抽象类的作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java的IO流详细解读

    java的IO流详细解读

    这篇文章主要介绍了java的IO流详细解读,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 利用Java实现带GUI的气泡诗词特效

    利用Java实现带GUI的气泡诗词特效

    这篇文章主要为大家介绍了如何利用Java语言实现带GUI的气泡诗词特效,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下
    2022-08-08
  • 使用maven实现有关Jsoup简单爬虫的步骤

    使用maven实现有关Jsoup简单爬虫的步骤

    这篇文章主要介绍了使用maven实现有关Jsoup简单爬虫的步骤,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • Java OpenCV学习之Mat的基本操作详解

    Java OpenCV学习之Mat的基本操作详解

    OpenCV用来存储图像,很多时候都会用到这个Mat方法。数字图像可看做一个数值矩阵, 其中的每一个元素表明一个像素点。Mat在 OpenCV 中表示的是 N 维稠密矩阵,与稠密矩阵相对的是稀疏矩阵。本文将重点介绍OpenCV中Mat的一些基本操作,需要的可以参考一下
    2022-03-03
  • Spring Cloud下OAUTH2注销的实现示例

    Spring Cloud下OAUTH2注销的实现示例

    本篇文章主要介绍了Spring Cloud下OAUTH2注销的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 浅谈Spring Boot中Redis缓存还能这么用

    浅谈Spring Boot中Redis缓存还能这么用

    这篇文章主要介绍了浅谈Spring Boot中Redis缓存还能这么用,这种方式是Spring Cache提供的统一接口,实现既可以是Redis,也可以是Ehcache或者其他支持这种规范的缓存框架,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Java getParameter()获取数据为空的问题

    Java getParameter()获取数据为空的问题

    这篇文章主要介绍了Java getParameter()获取数据为空的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Springboot整合Netty自定义协议实现示例详解

    Springboot整合Netty自定义协议实现示例详解

    这篇文章主要为大家介绍了Springboot整合Netty自定义协议实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 解决CentOS7中运行jar包报错:xxx(Permission denied)

    解决CentOS7中运行jar包报错:xxx(Permission denied)

    在实际工作我们经常会在linux上运行Spring boot编写的微服务程序,下面这篇文章主要给大家介绍了关于如何解决CentOS7中运行jar包报错:xxx(Permission denied)的相关资料,需要的朋友可以参考下
    2024-02-02

最新评论