mybatis-flex实现多数据源操作

 更新时间:2024年06月24日 10:12:12   作者:kunkun2580  
MyBaits-Flex内置了功能完善的多数据源支持,本文主要介绍了mybatis-flex实现多数据源操作,具有一定的参考价值,感兴趣的可以了解一下

多数据源

MyBaits-Flex 内置了功能完善的多数据源支持^1.0.6,不需要借助第三方插件或者依赖,开箱即用, 支持包括 druidhikaricpdbcp2beecp 在内的任何数据源,MyBatis-Flex 多数据源配置如下:

mybatis-flex:
  datasource:
    ds1:
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
    ds2:
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

在以上配置中,ds1 和 ds2 是由用户自定义的,我们可以理解为数据源的名称,或者数据源的 key,这个在动态切换数据库中非常有用。

在无 Spring 框架的场景下,代码如下:

DataSource dataSource1 = new HikariDataSource();
dataSource1.setJdbcUrl(....)

DataSource dataSource2 = new HikariDataSource();
dataSource2.setJdbcUrl(....)

DataSource dataSource3 = new HikariDataSource();
dataSource3.setJdbcUrl(....)

MybatisFlexBootstrap.getInstance()
        .setDataSource("ds1", dataSource1)
        .addDataSource("ds2", dataSource2)
        .addDataSource("ds3", dataSource3)
        .start();

开始使用

默认使用第一个配置的数据源:

List<Row> rows = Db.selectAll("tb_account");
System.out.println(rows);

通过编码的方式,切换到数据源 ds2

try{
    DataSourceKey.use("ds2")
    List<Row> rows = Db.selectAll("tb_account");
    System.out.println(rows);
}finally{
    DataSourceKey.clear();
}

或者

List<Row> rows =  DataSourceKey.use("ds2"
    , () -> Db.selectAll("tb_account"));

数据源切换(设置)

MyBatis-Flex 提供了 4 种方式来配置数据源:

  • 1、编码,使用DataSourceKey.use 方法。
  • 2、@UseDataSource("dataSourceName") 在 Mapper 类上,添加注解,用于指定使用哪个数据源。
  • 3、@UseDataSource("dataSourceName") 在 Mapper 方法上,添加注解,用于指定使用哪个数据源。
  • 4、@Table(dataSource="dataSourceName") 在 Entity 类上添加注解,该 Entity 的增删改查请求默认使用该数据源。

在 SpringBoot 项目上,@UseDataSource("dataSourceName") 也可用于在 Controller 或者 Service 上。若是 Spring 项目(非 SpringBoot), 用户需要参考 MultiDataSourceAutoConfiguration 进行配置后才能使用。

DataSourceKey.use 示例:

try{
    DataSourceKey.use("ds2")
    List<Row> rows = Db.selectAll("tb_account");
    System.out.println(rows);
}finally{
    DataSourceKey.clear();
}

@UseDataSource("dataSourceName") 示例:

@UseDataSource("ds2")
interface AccountMapper extends BaseMapper{
    List<Account> myMethod();
}

或者

interface AccountMapper extends BaseMapper{

    @UseDataSource("ds2")
    List<Account> myMethod();
}

@Table(dataSource="dataSourceName") 示例:

@Table(value = "tb_account", dataSource = "ds2")
public class Account {

    @Id(keyType = KeyType.Auto)
    private Long id;

    private String userName;
}

数据源配置的优先级

DataSourceKey.use() > @UseDataSource()在方法上 > @UseDataSource()在类上 >@Table(dataSource="...")

更多的 Spring Yaml 配置支持

mybatis-flex:
  datasource:
    ds1:
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
    ds2:
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

在以上配置中,ds1 和 ds2 并未指定使用哪个数据连接池,MyBatis-Flex 会 自动探测 当前项目依赖了哪个连接池。 目前支持了 druidhikaricpdbcp2beecp 的自动探测,如果项目中使用的不是这 4 种类型只有,需要添加 type 配置,如下所示:

mybatis-flex:
  datasource:
    ds1:
      type: com.your.datasource.type1
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
    ds2:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

同时,项目若使用到了多个数据源类型,则也需要添加 type 来指定当前数据源的类型。

除了 typeurlusernamepassword 的配置以外,MyBatis-Flex 支持该 DataSource 类型的所有参数配置, 例如,在 DruidDataSource 类中存在 setAsyncInit 方法,我们就可以添加 asyncInit 的配置,如下所示:

mybatis-flex:
  datasource:
    ds1:
      type: druid
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
      asyncInit: true
    ds2:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

因此,只要该 DataSource 有 setter 方法,我们就可以在配置文件中进行配。与此相反的是:若该 DataSource 类型没有该属性,则不能使用这个配置。

提示

在数据源的配置中,type 可以配置为某个 DataSource 的类名,也可以配置为别名,别名支持有:druid、 hikarihikaricpbeebeecpdbcpdbcp2

动态添加新的数据源

在多租户等某些场景下,我们可能需要用到动态的添加新的数据源,此时可以通过如下的方式进行添加。

FlexDataSource flexDataSource = FlexGlobalConfig.getDefaultConfig()
                                .getDataSource();

//新的数据源
HikariDataSource newDataSource = new HikariDataSource();

flexDataSource.addDataSource("newKey", newDataSource);

需要注意的是: 通过 FlexGlobalConfig 去获取 FlexDataSource 时,需等待应用完全启动成功后,才能正常获取 FlexDataSource, 否则将会得到 null 值。

Spring 用户可以通过 ApplicationListener 去监听 ContextRefreshedEvent 事件,然后再去添加新的数据源,如下代码所示:

public class DataSourceInitListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        FlexDataSource dataSource = FlexGlobalConfig.getDefaultConfig()
                                    .getDataSource();

        dataSource.addDataSource("....", new DruidDataSource("..."));
    }

}

多数据源负载均衡 ^1.5.4

数据源负载均衡指的是:在进行数据查询的时候,随机使用一个数据源。 这是的在高并发的场景下,起到负载的效果。

假设多数据源配置如下:

mybatis-flex:
  datasource:
    ds1:
      type: druid
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
      asyncInit: true
    ds2:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456
    other:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

以上配置了三个数据源,分别为:ds1ds2other,假设我们想负载均衡使用 ds1ds2 ,那么代码如下:

try{
    DataSourceKey.use("ds*");
    List<Row> rows = Db.selectAll("tb_account");
    System.out.println(rows);
}finally{
    DataSourceKey.clear();
}

DataSourceKey.use("ds*") 中的 ds* 指的是使用 ds 开头的任意一个数据源。ds* 必须以 "*" 结尾, 中间不能有空格,比如 "ds *" 中间有空格是不行的。

到此这篇关于mybatis-flex实现多数据源操作的文章就介绍到这了,更多相关mybatis-flex 多数据源操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java如何实现百万数据excel导出功能

    详解Java如何实现百万数据excel导出功能

    这篇文章主要为大家详细介绍了Java如何实现百万数据excel导出功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • Java SpringMVC的自定义异常类

    Java SpringMVC的自定义异常类

    这篇文章主要为大家详细介绍了SpringMVC的自定义异常类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • java 线程创建多线程详解

    java 线程创建多线程详解

    本文主要讲解java 线程创建多线程的知识,这里对java线程的创建做了详细介绍,并附简单示例代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • Java中throw和throws异常处理完整例子说明

    Java中throw和throws异常处理完整例子说明

    这篇文章主要给大家介绍了关于Java中throw和throws异常处理的相关资料, throw关键字是用于在方法内抛出异常,而throws关键字是在方法声明中指定可能抛出的异常,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • 详解如何在React中逃离闭包陷阱

    详解如何在React中逃离闭包陷阱

    众所周知,JavaScript 中的闭包(Closures)一定是这种语言最可怕的特性之一,另外它可能也是最隐蔽的语言特性之一,我们在编写 React 代码时经常会用到它,但是大多数时候我们甚至没有意识到这一点,本文小编将和大家一起深入探讨如何在React中逃离闭包陷阱
    2023-09-09
  • springboot嵌套子类使用方式—前端与后台开发的注意事项

    springboot嵌套子类使用方式—前端与后台开发的注意事项

    这篇文章主要介绍了springboot嵌套子类使用方式—前端与后台开发的注意事项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java中获取类加载路径和项目根路径的5种方式分析

    java中获取类加载路径和项目根路径的5种方式分析

    本篇文章介绍了,java中获取类加载路径和项目根路径的5种方式分析。需要的朋友参考下
    2013-05-05
  • SpringBoot yaml语法与JRS303校验超详细讲解

    SpringBoot yaml语法与JRS303校验超详细讲解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 对ArrayList和LinkedList底层实现原理详解

    对ArrayList和LinkedList底层实现原理详解

    今天小编就为大家分享一篇对ArrayList和LinkedList底层实现原理详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Java List双击事件实现方法

    Java List双击事件实现方法

    这篇文章主要介绍了Java List双击事件实现方法,需要的朋友可以参考下
    2014-09-09

最新评论