SpringBoot配置双MongoDB数据库失败,求正确配置方法
Spring Boot配置同集群下的多个MongoDB数据库
问题背景
原本使用单个MongoDB数据库Active,配置如下:
spring.data.mongodb.database=Active spring.data.mongodb.uri=mongodb+srv://<my_uri>
现在需要新增同集群下的次级数据库Inactive,尝试用spring.data.mongodb.db1/db2前缀配置但未生效。
解决方案
Spring Boot默认的MongoDB自动配置仅支持单数据库,多数据库需要自定义配置,步骤如下:
1. 修改配置文件
将原配置替换为自定义前缀的多库配置(以.properties为例):
# 主数据库(Active) mongodb.active.uri=mongodb+srv://<my_uri> mongodb.active.database=Active # 次级数据库(Inactive) mongodb.inactive.uri=mongodb+srv://<my_uri> mongodb.inactive.database=Inactive
2. 编写配置属性类(可选,更优雅的配置绑定)
创建两个配置属性类,分别绑定上述配置:
// Active数据库属性类 import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "mongodb.active") public class ActiveMongoProperties { private String uri; private String database; // Getter & Setter public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } }
// Inactive数据库属性类 import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "mongodb.inactive") public class InactiveMongoProperties { private String uri; private String database; // Getter & Setter public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } }
3. 编写多MongoDB配置类
创建配置类生成两个MongoTemplate实例,分别对应两个数据库:
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.mongodb.core.MongoTemplate; @Configuration @EnableConfigurationProperties({ActiveMongoProperties.class, InactiveMongoProperties.class}) public class MultipleMongoConfig { private final ActiveMongoProperties activeProps; private final InactiveMongoProperties inactiveProps; // 构造注入配置属性 public MultipleMongoConfig(ActiveMongoProperties activeProps, InactiveMongoProperties inactiveProps) { this.activeProps = activeProps; this.inactiveProps = inactiveProps; } // 主数据库模板,标记@Primary作为默认实例 @Primary @Bean(name = "activeMongoTemplate") public MongoTemplate activeMongoTemplate() { MongoClient client = MongoClients.create(activeProps.getUri()); return new MongoTemplate(client, activeProps.getDatabase()); } // 次级数据库模板 @Bean(name = "inactiveMongoTemplate") public MongoTemplate inactiveMongoTemplate() { MongoClient client = MongoClients.create(inactiveProps.getUri()); return new MongoTemplate(client, inactiveProps.getDatabase()); } }
4. 在业务代码中使用多数据库
在Service或Repository中通过@Qualifier指定要使用的MongoTemplate:
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; @Service public class DataService { private final MongoTemplate activeTemplate; private final MongoTemplate inactiveTemplate; public DataService(@Qualifier("activeMongoTemplate") MongoTemplate activeTemplate, @Qualifier("inactiveMongoTemplate") MongoTemplate inactiveTemplate) { this.activeTemplate = activeTemplate; this.inactiveTemplate = inactiveTemplate; } // 示例:保存数据到Active库 public void saveToActive(Object entity) { activeTemplate.save(entity); } // 示例:保存数据到Inactive库 public void saveToInactive(Object entity) { inactiveTemplate.save(entity); } }
如果使用MongoRepository,可以通过@MongoTemplate注解指定对应的模板:
import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.core.annotation.MongoTemplate; import org.springframework.stereotype.Repository; @Repository public interface InactiveEntityRepository extends MongoRepository<InactiveEntity, String> { @Override @MongoTemplate(name = "inactiveMongoTemplate") <S extends InactiveEntity> S save(S entity); }
原配置失效原因
Spring Boot的spring.data.mongodb.*前缀是为默认单数据库自动配置设计的,不支持多数据库的扩展配置,必须通过自定义前缀+手动配置MongoClient和MongoTemplate的方式实现多库支持。
内容的提问来源于stack exchange,提问作者newstudent
相关产品推荐
相关产品推荐

