gpt4 book ai didi

java - 在 Spring Boot 中使用两个数据源

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:28 25 4
gpt4 key购买 nike

我在我的项目中使用 Spring Boot 1.3.3一个数据库,现在我想使用两个具有相同架构的数据库> 但不同的连接

我想使用相同的存储库、实体,并根据情况找到告诉 spring 我想使用哪个数据源的方法。

最佳答案

如果有人遇到这个问题,我已经找到了解决方案:

首先,您的application.properties 应该如下所示:

datasource:
primary:
url: jdbc:mysql://localhost:3306/primary_db
username: your_username
password: your_password
driver-class-name: com.mysql.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/secondary_db
username: your_username
password: your_password
driver-class-name: com.mysql.jdbc.Driver

之后,您必须使用您的数据库创建一个枚举:

public enum Database {
PRIMARY,
SECONDARY
}

然后,您创建一个 ThreadLocal:

public class DatabaseThreadContext {

private static final ThreadLocal<Database> current = new ThreadLocal<>();

public static void setCurrentDatabase(Database database) {
current.set(database);
}

public static Object getCurrentDatabase() {
return current.get();
}

}

魔法来了,你必须使用 AbstractRoutingDataSource,它在 2007 年的 Spring 2 中实现:

public class RoutingDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
return DatabaseThreadContext.getCurrentDatabase();
}

}

最后在您的 Spring Boot 应用程序中注入(inject)一个配置:

@Configuration
public class DatabaseRouter {

@Bean
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}

@Bean
@Primary
public DataSource dataSource() {
Map<Object, Object> targetDatasources = new HashMap<Object, Object>(){{
put(Database.SECONDARY, secondaryDataSource());
put(Database.PRIMARY, primaryDataSource());
}};
RoutingDataSource routingDataSource = new RoutingDataSource();
routingDataSource.setDefaultTargetDataSource(primaryDataSource());
routingDataSource.setTargetDataSources(targetDatasources);
routingDataSource.afterPropertiesSet();
return routingDataSource;
}

}

在每个请求中,如果您想在数据库之间切换,只需使用此函数:DatabaseThreadContext.setCurrentDatabase(Database.PRIMARY);

此外,您可以同时拥有两个以上的数据库。

关于java - 在 Spring Boot 中使用两个数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637974/

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