gpt4 book ai didi

java - Spring data mongoDB 数据库连接的惰性配置

转载 作者:行者123 更新时间:2023-12-02 10:39:45 25 4
gpt4 key购买 nike

我有一个 Multi-Tenancy mongoDB 应用程序,我们假设到正确数据库的正确连接是从 HTTP 请求 header 中的租户名称中选择的(我使用之前准备的带有租户名称的属性文件)。当应用程序启动时,mongoDB 正在配置,并且我没有有关租户的信息,因为尚未发送对应用程序的任何请求,所以我不知道应该连接到哪个数据库。当我尝试从 mongo 存储库获取一些数据(然后我从 HTTP 请求中获得租户名称)时,是否有可能动态配置 mongoDB 与数据库的连接?

MongoDb配置:

@Configuration
public class MongoDbConfiguration {

private final MongoConnector mongoConnector;

@Autowired
public MongoDbConfiguration(MongoConnector mongoConnector) {
this.mongoConnector = mongoConnector;
}

@Bean
public MongoDbFactory mongoDbFactory() {
return new MultiTenantSingleMongoDbFactory(mongoConnector, new MongoExceptionTranslator());
}

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

最佳答案

@Component
@Slf4j
public class MultiTenantMongoDbFactory extends SimpleMongoDbFactory {

private static final Logger logger = LoggerFactory.getLogger(MultiTenantMongoDbFactory.class);

private Map<String, DbConfig> tenantToDbConfig;

private Map<String, MongoDatabase> tenantToMongoDatabase;

@Autowired
public MultiTenantMongoDbFactory(
final @Qualifier("sibTenantContexts") Map<String, DbConfig> dbConfigs,
final SibEnvironment env) {

super(new MongoClientURI(env.getDefaultDatabase()));
this.tenantToDbConfig = dbConfigs;
// Initialize tenantToMongoDatabase map.
buildTenantDbs();
}

@Override
public MongoDatabase getDb() {

String tenantId = (!StringUtils.isEmpty(TenantContext.getId()) ? TenantContext.getId()
: SibConstant.DEFAULT_TENANT);
return this.tenantToMongoDatabase.get(tenantId);
}

/**
* Create tenantToMongoDatabase map.
*/
@SuppressWarnings("resource")
private void buildTenantDbs() {

log.debug("Building tenantDB configuration.");
this.tenantToMongoDatabase = new HashMap<>();
/*
* for each tenant fetch dbConfig and intitialize MongoClient and set it to
* tenantToMongoDatabase
*/
for (Entry<String, DbConfig> idToDbconfig : this.tenantToDbConfig.entrySet()) {
try {
this.tenantToMongoDatabase.put(idToDbconfig.getKey(),
new MongoClient(new MongoClientURI(idToDbconfig.getValue()
.getUri())).getDatabase(idToDbconfig.getValue()
.getDatabase()));
} catch (MongoException e) {
log.error(e.getMessage(), e.getCause());
}
}
}
}

在此,tenantToDbConfig 是我在应用程序启动时创建的一个 bean,其中我针对每个租户存储 DBConfiguration(如(Url/数据库名称))。有一个在启动时需要的默认数据库,对于每个请求,我期望请求 header 中包含tenantId。

关于java - Spring data mongoDB 数据库连接的惰性配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53009461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com