首页 > 数据库 >Mongodb多租户功能实现

Mongodb多租户功能实现

时间:2023-01-28 15:13:02浏览次数:48  
标签:功能 return String 租户 Mongodb static mongodb import public

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;

@Slf4j
public class MyMongoDbFactory extends SimpleMongoClientDbFactory {


    public MyMongoDbFactory(MongoClient mongoClient, String databaseName) {
        super(mongoClient, databaseName);
    }

    @Override
    protected void closeClient() {
        getMongoClient().close();
    }

    @Override
    protected MongoDatabase doGetMongoDatabase(String dbName) {
        //获取租户信息
        Long tenantId = TenantContextHandler.getCurrentTenantId();
        if (tenantId != null) {
            MongoClient mongoClient = getMongoClient();
            String databaseName = getDBName(tenantId);
            log.info("切换到租户[{}]的MongoDatabase [{}]", tenantId, databaseName);
            return mongoClient.getDatabase(databaseName);
        } else {
            log.info("切换到[主库]MongoDatabase [{}]", dbName);
            return getMongoClient().getDatabase(dbName);
        }
    }


    @Override
    protected MongoClient getMongoClient() {
        return super.getMongoClient();
    }

    private static final String DBNAME_PREFIX = "TEST_";

    /**
     * 获取当前的DatabaseName
     *
     * @return 数据库名
     */
    private static String getDBName(Long tenantId) {
        return DBNAME_PREFIX + tenantId;

    }
}
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
@Configuration
public class TenantConfiguration {

    @Autowired
    private MongoProperties prop;

    @Autowired
    private MongoClient mongoClient;


    @Bean(name = "mongoTemplate")
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoDbFactory());
    }

    //主库工厂
    @Bean(name = "mongoDbFactory")
    public MongoDbFactory mongoDbFactory() {
        String mongoUri = prop.getUri();
        ////mongodb://username:password@hostname:port/dbname
        return new MyMongoDbFactory(mongoClient, getDefaultDBName(mongoUri));
    }


    @Bean(name = "mongoClient")
    public MongoClient mongoClient(){
        String mongoUri = prop.getUri();
        log.info("创建主库mongoClient, uri:{}", mongoUri);
        return MongoClients.create(mongoUri);
    }


    private static final String patternStr = "mongodb://(.*)@(.*):(.*)/(.*)";
    private static final Pattern pattern = Pattern.compile(patternStr);


    private String getDefaultDBName(String mongoUri) {
        String database = prop.getDatabase();
        if (database == null) {
            Matcher m = pattern.matcher(mongoUri);
            if (m.find()) {
                database = m.group(4);
            }
        }
        return database;
    }

}
/**
 * 租户信息,即用户当前所在的空间id
 */
public class TenantContextHandler {

    /**
     * 空间id信息
     */
    private static ThreadLocal<Long> tenantContext = new InheritableThreadLocal<>();

    /**
     * 设置空间信息
     * @param
     */
    public static void setCurrentTenantId(Long tenantId) {
        tenantContext.set(tenantId);
    }

    /**
     * 获取当前租户id
     *
     * @return
     */
    public static Long getCurrentTenantId() {
        return tenantContext.get();
    }

    /**
     * 清除缓存数据
     */
    public static void clean() {
        tenantContext.remove();
    }

    public static void refresh() {
        tenantContext = new InheritableThreadLocal<>();
    }
}
# yml配置
spring:
  data:
    mongodb:
      uri:  mongodb://username:password@hostname:port/dbname
      database: TEST


 

spring boot版本:2.2.6

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
 </dependency>

标签:功能,return,String,租户,Mongodb,static,mongodb,import,public
From: https://www.cnblogs.com/zhangshiwen/p/17070334.html

相关文章

  • SAAS化架构多租户数据如何存储
    昨天沟通一个SAAS化架构多租户数据如何存储,这个问题讨论的很激烈,最后经过多位大牛的经验,总结出3种方式,采用哪种情况还是根据场景评估下:1、分库分表、表名带租户号,开发的时......
  • 粘贴板同步功能
    packagecom.company.app.controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestControlle......
  • Dynamics 365 PDF功能
    前言关于PDF功能,好像老版本的CRM仅支持指定实体启用(本人没有用过老版本的CRM,入行以来实施的都是v9的了),现在新版本的CRM已经支持自定义实体启用PDF功能。使用该功能需要的......
  • 为什么看上去很简单的智慧功能点要价上千万?
    人工智能(ArtificialIntelligence,AI)已经不是什么新概念,第三次浪潮于2016年AlphaGo战胜李世石为标志正式开启,至今也已经走过6个年头。发展至今,AI已经进入老百姓的日常生活,比......
  • 操作系统的概念、功能和目标
    操作系统的概念、功能和目标操作系统的概念(定义)操作系统(OperatingSystem,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配......
  • 这6款功能强大、堪称良心的手机浏览器,还有谁不知道
    很多朋友在手机端用过Safari浏览器、UC浏览器以及QQ浏览器,除了这些主流的手机浏览器,大家还用过哪些比较好用的浏览器呢?今天给大家推荐6款小巧好用、功能强大,性能稳定,实用功......
  • MongoDB 基础(二)mongodb 与 T-SQL 对比
    SQLTerms/ConceptsMongoDBTerms/ConceptsdatabasedatabasetableCollection(集合)rowdocument(文档)columnKey(键)ValueValue(值)indexindextablejoinsembeddeddocumentsandlin......
  • MongoDB 基础(三)mongodb 中的索引使用
    MongoDB中的索引和其他数据库索引类似,也是使用B-Tree结构。MongoDB的索引是在collection级别上的,并且支持在任何列或者集合内的文档的子列中创建索引。 下面是官方给出的一......
  • 自从学习了MongoDB高可用,慢慢的喜欢上了它,之前确实冷落了
    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB高可用和片键策略,实现......
  • 自从学习了MongoDB高可用,慢慢的喜欢上了它,之前确实冷落了
    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB高可用和片键策略,实......