我有一个按域划分的多模块 Maven 项目(如在域驱动设计中)。要求是每个域都有自己的数据库。为了降低成本,现阶段决定让每个数据库在单个 Mongo 服务器上运行,但有自己的配置。
我在下面包含了两个示例配置,但还有更多。
我面临的问题是所有集合都在每个数据库中创建。例如域 A 的数据库也将具有域 B、C 和 D 的集合。域 B 将具有 A、C 和 D 的集合,依此类推。
数据正在持久化到正确的集合中,所有“冗余”的集合都是空的。我想弄清楚如何解决这个问题,以便每个数据库只有它关联实体的集合。
@Configuration
@EnableMongoRepositories(
basePackageClasses = {DomainAMongoRepository.class},
mongoTemplateRef = "domainAMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainADbMongoConfiguration.class)
public class DomainADbConfig extends AbstractMongoClientConfiguration {
private final DomainADbMongoConfiguration mongoConfiguration;
@Autowired
public DomainADbConfig(DomainADbMongoConfiguration mongoConfiguration) {
this.mongoConfiguration = mongoConfiguration;
}
@Primary
@Bean(name = "domainAMongoTemplate")
public MongoTemplate domainAMongoTemplate(
@Qualifier("domainAMongoDbFactory") MongoDatabaseFactory mongoDbFactory,
@Qualifier("domainAMongoConverter") MappingMongoConverter mongoConverter
) {
return new MongoTemplate(mongoDbFactory, mongoConverter);
}
@Primary
@Bean(name = "domainAMongoDbFactory")
public MongoDatabaseFactory mongoDbFactory(
@Qualifier("domainAMongoClient") MongoClient mongoClient
) {
return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
}
@Primary
@Bean(name = "domainAMongoConverter")
public MappingMongoConverter mongoConverter() throws Exception {
MongoMappingContext mongoMappingContext =
mongoMappingContext(customConversions(), mongoManagedTypes());
mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
mongoMappingContext.afterPropertiesSet();
MappingMongoConverter converter =
new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()), mongoMappingContext);
converter.setCustomConversions(customConversions());
converter.afterPropertiesSet();
return converter;
}
@Override
@Bean(name = "domainAMongoClient")
@Primary
public MongoClient mongoClient() {
return MongoClients.create(
MongoClientSettings.builder()
.uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
.applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
.build());
}
@Override
protected String getDatabaseName() {
return mongoConfiguration.getDatabase();
}
}
@ConfigurationProperties("domain-a.mongo")
class DomainADbMongoConfiguration {
private String database;
private String uri;
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
}
}
@Configuration
@EnableMongoRepositories(
basePackageClasses = {DomainBTypeMongoRepository.class, DomainBMongoRepository.class},
mongoTemplateRef = "domainBMongoTemplate")
@Slf4j
@EnableConfigurationProperties(DomainBDbMongoConfiguration.class)
public class DomainBDbConfig extends AbstractMongoClientConfiguration {
private final DomainBDbMongoConfiguration mongoConfiguration;
@Autowired
public DomainBDbConfig(DomainBDbMongoConfiguration mongoConfiguration) {
this.mongoConfiguration = mongoConfiguration;
}
@Bean(name = "domainBMongoTemplate")
public MongoTemplate topicMongoTemplate(
@Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory,
@Qualifier("domainBMongoConverter") MappingMongoConverter domainBMongoConverter) {
log.info("Connecting to Mongo DomainBs db");
return new MongoTemplate(domainBMongoDbFactory, domainBMongoConverter);
}
@Bean(name = "domainBMongoDbFactory")
public MongoDatabaseFactory mongoDbFactory(
@Qualifier("domainBMongoClient") MongoClient mongoClient) {
return new SimpleMongoClientDatabaseFactory(mongoClient, getDatabaseName());
}
@Bean(name = "domainBMongoConverter")
public MappingMongoConverter mongoConverter(
@Qualifier("domainBMongoDbFactory") MongoDatabaseFactory domainBMongoDbFactory) throws Exception {
MongoMappingContext mongoMappingContext =
mongoMappingContext(customConversions(), mongoManagedTypes());
mongoMappingContext.setInitialEntitySet(getInitialEntitySet());
mongoMappingContext.afterPropertiesSet();
MappingMongoConverter converter =
new MappingMongoConverter(
new DefaultDbRefResolver(domainBMongoDbFactory), mongoMappingContext);
converter.setCustomConversions(customConversions());
converter.afterPropertiesSet();
return converter;
}
@Override
@Bean(name = "domainBMongoClient")
public MongoClient mongoClient() {
return MongoClients.create(
MongoClientSettings.builder()
.uuidRepresentation(UuidRepresentation.JAVA_LEGACY)
.applyConnectionString(new ConnectionString(mongoConfiguration.getUri()))
.build());
}
@Override
protected boolean autoIndexCreation() {
return true;
}
@Override
protected String getDatabaseName() {
return mongoConfiguration.getDatabase();
}
}
@ConfigurationProperties("domainBs.mongo")
class DomainBDbMongoConfiguration {
private String uri;
private String database;
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
}