gpt4 book ai didi

mysql - 如何根据 REST API 请求中的 header 连接到多个 MySQL 数据库

转载 作者:行者123 更新时间:2023-11-29 09:56:00 26 4
gpt4 key购买 nike

我正在创建一个 Multi-Tenancy Spring Boot - JPA 应用程序。

在此应用程序中,我想使用通过 API 请求作为 header 发送的数据库名称连接到 MySQL 数据库。

我在线检查了很多 Multi-Tenancy 项目示例,但仍然找不到解决方案。

有人可以建议我一种方法吗?

最佳答案

您可以使用AbstractRoutingDataSource来实现这一点。 AbstractRoutingDataSource 需要信息来了解要路由到哪个实际 DataSource(称为Context),该信息由 defineCurrentLookupKey() 提供 方法。使用 here 中的示例。

定义上下文,例如:

public enum ClientDatabase {
CLIENT_A, CLIENT_B
}

然后您需要定义将在defineCurrentLookupKey()中使用的Context Holder

public class ClientDatabaseContextHolder {

private static ThreadLocal<ClientDatabase> CONTEXT = new ThreadLocal<>();

public static void set(ClientDatabase clientDatabase) {
Assert.notNull(clientDatabase, "clientDatabase cannot be null");
CONTEXT.set(clientDatabase);
}

public static ClientDatabase getClientDatabase() {
return CONTEXT.get();
}

public static void clear() {
CONTEXT.remove();
}
}

然后您可以扩展AbstractRoutingDataSource,如下所示:

public class ClientDataSourceRouter extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
return ClientDatabaseContextHolder.getClientDatabase();
}
}

最后,DataSource bean 配置:

@Bean
public DataSource clientDatasource() {
Map<Object, Object> targetDataSources = new HashMap<>();
DataSource clientADatasource = clientADatasource();
DataSource clientBDatasource = clientBDatasource();
targetDataSources.put(ClientDatabase.CLIENT_A,
clientADatasource);
targetDataSources.put(ClientDatabase.CLIENT_B,
clientBDatasource);

ClientDataSourceRouter clientRoutingDatasource
= new ClientDataSourceRouter();
clientRoutingDatasource.setTargetDataSources(targetDataSources);
clientRoutingDatasource.setDefaultTargetDataSource(clientADatasource);
return clientRoutingDatasource;
}

关于mysql - 如何根据 REST API 请求中的 header 连接到多个 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53832656/

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