首页 > 其他分享 >通过mybatisflex获取多数据源mapper

通过mybatisflex获取多数据源mapper

时间:2024-05-16 23:53:36浏览次数:21  
标签:mapper mybatisflex 数据源 bootstrap db ret static String

基于mybatisflex1.8.4:

@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Slf4j
public class DataSource {

  public static final String A = "a";

  public static final String B = "b";

  public static final String C = "c";

  public static final String D = "d";

  public static final String E = "e";

  public static final String F = "f";


  private static volatile MybatisFlexBootstrap bootstrap;

  @Setter
  private static boolean logSql = false;

  private static final Set<Class<?>> MAPPERS = new HashSet<>();

  private static final Set<String> DBS = new HashSet<>();

  public static <T> T getMapper(Class<T> mapper) {
    if (bootstrap == null) {
      init(mapper);
    }
    if (!MAPPERS.contains(mapper)) {
      synchronized (MAPPERS) {
        if (!MAPPERS.contains(mapper)) {
          Set<String> dbInMapper = getDbInMapper(mapper);
          if (!DBS.containsAll(dbInMapper)) {
            Properties properties = PropertiesUtils.get(Module.COMMON);
            dbInMapper.removeAll(DBS);
            for (String db : dbInMapper) {
              bootstrap.addDataSource(db, getHikariDataSource(properties, db));
              try {
                DataSourceKey.use(db);
                Db.selectCount("select 1");
              } finally {
                DataSourceKey.clear();
              }
            }
          }
          bootstrap.addMapper(mapper);
          bootstrap.getConfiguration().addMapper(mapper);
          MAPPERS.add(mapper);
        }
      }
    }
    return bootstrap.getMapper(mapper);
  }


  @SneakyThrows
  private static HikariDataSource getHikariDataSource(Properties properties, String db) {
    HikariDataSource ret = new HikariDataSource();
    ret.setDriverClassName("com.mysql.cj.jdbc.Driver");
    ret.setJdbcUrl(properties.getProperty("database." + db + ".jdbcUrl"));
    ret.setUsername(properties.getProperty("database.username"));
    ret.setPassword(properties.getProperty("database.password"));
    ret.setPoolName(DataSource.class.getSimpleName() + "-" + db);
    ret.setConnectionTimeout(10000);
    ret.setLoginTimeout(10);
    return ret;
  }

  private static void init(Class<?> mapper) {
    if (bootstrap != null) {
      return;
    }
    synchronized (DataSource.class) {
      if (bootstrap != null) {
        return;
      }
      Logger log = LoggerFactory.getLogger(DataSource.class);
      log.info("启动数据库连接...");
      Set<String> dbs = getDbInMapper(mapper);
      DBS.addAll(dbs);
      Properties properties = PropertiesUtils.get(Module.COMMON);
      FlexGlobalConfig defaultConfig = FlexGlobalConfig.getDefaultConfig();
      defaultConfig.setPrintBanner(false);
      bootstrap = MybatisFlexBootstrap.getInstance();
      for (String db : dbs) {
        bootstrap.addDataSource(db, getHikariDataSource(properties, db));
      }
      bootstrap = bootstrap.start();
      Configuration configuration = bootstrap.getConfiguration();
      configuration.setMapUnderscoreToCamelCase(true);

      bootstrap.addMapper(mapper);
      bootstrap.getConfiguration().addMapper(mapper);
      MAPPERS.add(mapper);

      try {
        for (String db : dbs) {
          DataSourceKey.use(db);
          Db.selectCount("select 1");
        }
      } finally {
        DataSourceKey.clear();
      }
      if (logSql) {
        AuditManager.setAuditEnable(true);
        AuditManager.setMessageCollector(msg -> log.info("SQL耗时{}毫秒({}):{}", msg.getElapsedTime(), msg.getDsName(), msg.getFullSql()));
      }
    }
  }


  public static void close() {
    if (bootstrap == null) {
      return;
    }
    Logger log = LoggerFactory.getLogger(DataSource.class);
    log.info("关闭数据库连接...");
    Map<String, javax.sql.DataSource> dataSourceMap = ((FlexDataSource) bootstrap.getDataSource()).getDataSourceMap();
    for (Map.Entry<String, javax.sql.DataSource> entry : dataSourceMap.entrySet()) {
      HikariDataSource source = (HikariDataSource) entry.getValue();
      source.close();
    }
    log.info("关闭数据库连接完成");
  }

  private static Set<String> getDbInMapper(Class<?> mapper) {
    HashSet<String> ret = new HashSet<>();
    UseDataSource annotation = mapper.getAnnotation(UseDataSource.class);
    if (annotation != null) {
      ret.add(annotation.value());
    }
    for (Method method : mapper.getMethods()) {
      UseDataSource annotation1 = method.getAnnotation(UseDataSource.class);
      if (annotation1 != null) {
        ret.add(annotation1.value());
      }
    }
    return ret;
  }
}

在mapper上通过@UseDataSource(DataSource.A)指定数据源

标签:mapper,mybatisflex,数据源,bootstrap,db,ret,static,String
From: https://www.cnblogs.com/JackieJK/p/18195118

相关文章

  • mybatis-plus mapper整理
    mybatis-plusmapper整理简介提供了操作数据的框架,避免使用jdbc操作数据,加速开发效率,支持多种数据库(databaseId)。既支持sql,mapper的编写,也支持注解@Select等,同时提供了一二级缓存,以及BaseMapper接口以及IService、ServiceImpl这些接口,来提供模板化的方法。同时还支持逆向工程生......
  • openGauss Linux下配置数据源
    Linux下配置数据源将openGauss提供的ODBCDRIVER(psqlodbcw.so)配置到数据源中便可使用。配置数据源需要配置“odbc.ini”和“odbcinst.ini”两个文件(在编译安装unixODBC过程中生成且默认放在“/usr/local/etc”目录下),并在服务器端进行配置。操作步骤获取unixODBC源码包。获取......
  • 整合druid数据源
    Druid是阿里巴巴开源的一个数据源,主要用于java数据库连接池,相比spring推荐的DBCP和hibernate推荐的C3P0、Proxool数据库连接池,Druid在市场上占有绝对的优势,Druid数据源由于有强大的监控特性、可拓展性等特点。使用导入依赖<dependency> <groupId>com.alibaba</groupId>......
  • Dynamic-Datasource动态数据源
    1、添加请求对应的数据源标签DynamicDataSourceContextHolder.push(ds);2、添加数据源  3、动态添加数据源privateDynamicRoutingDataSourcedataSource;privateDefaultDataSourceCreatordataSourceCreator;//创建数据源DataSourcePropertydataSourceProperty......
  • mybatisPlus多数据源的使用&使用 lambdaQuery 导致多数据源失效
    依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version></dependency>配置文件:spr......
  • SpringBoot整合Mybatis时mapper文件和xml文件的位置
    xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置mybatis.mapper-locations=classpath:mapper/*.xml或mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目......
  • 实时行情数据源接口websocket接入方法
    ​支持如下产品对接:外汇、国际期货、国内期货、国际金银、数字货币、股指期货、美股、印度股、港股、台股、A股产品代码获取地址:http://39.107.99.235:1008/market/market.php产品代码:比特币btcusdt以太坊ethusdt恒指期货HSI德指期货DAX英镑美元fx_sgbpusd欧......
  • Redis多数据源,看这篇就够了
    背景Redis多数据源常见的场景:分区数据处理:当数据量增长时,单个Redis实例可能无法处理所有的数据。通过使用多个Redis数据源,可以将数据分区存储在不同的实例中,使得数据处理更加高效。多租户应用程序:对于多租户应用程序,每个租户可以拥有自己的Redis数据源,以确保数据隔离和安全性......
  • 异构数据源同步之表结构同步 → 通过 jdbc 实现,没那么简单
    开心一刻今天坐沙发上看电视,旁边的老婆拿着手机贴了过来老婆:老公,这次出门旅游,机票我准备买了哈我:嗯老婆:你、我、你爸妈、我爸妈,一共六张票老婆:这上面还有意外保险,要不要买?我:都特么团灭了,还买啥保险?异构数据源同步概念介绍数据源,不只是包含关系型数据库,还包括NoSQL、数......
  • Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发
    一、写在开头最近一直在更新《Java成长计划》这个专栏,主要是Java全流程学习的一个记录,目前已经更新到Java并发多线程部分,后续会继续更新;而今天准备开设一个全新的专栏《EfficientFarm》。EfficientFarm:高效农场,期许软件开发工作能够像很多国外的高效农场一般机械化,自动化。拿来......