首页 > 解决方案 > 在开发和生产中使用不同的模式。如何在 Spring 中配置它?

问题描述

我想为 MongoDB 提供两种不同的模式:一种用于生产,另一种用于开发。我怎么能在春天做到这一点?

例如,如果我在生产中有一个客户和一个客户集合,我不希望当我在开发模式下运行我的应用程序时,它在生产中读取和写入相同的集合。配置它的最佳方法是什么?

如果可能的话,我不喜欢使用内存数据库。

这是我目前的配置:

@Configuration
@EnableConfigurationProperties(MongoProperties.class)
@EnableMongoRepositories(basePackages = { "eu.company.web.repository" })
public class DatabaseConfig extends AbstractMongoConfiguration {

private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseConfig.class);

private final static int MAX_CONNECTION_IDLE_TIMES = 3 * 60 * 1000;

private final static int MAX_CONNECTION_LIFE_TIMES = 15 * 60 * 1000;

private final MongoProperties dbProperties;

@Value("${spring.data.mongodb.host2}")
private String host2;

@Value("${spring.data.mongodb.host3}")
private String host3;

public DatabaseConfig(MongoProperties properties) {
    this.dbProperties = properties;
}


@Override
protected String getMappingBasePackage() {
    return "eu.company.web.repository.model";
}

@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
}

@Override
public MongoClient mongoClient() {
    LOGGER.info("mongoClient(): init mongo network client.");
    final ServerAddress defaultAddress = new ServerAddress("localhost", MongoProperties.DEFAULT_PORT);
    final ServerAddress addr = ServerAddressHelper
            .createServerAddress(StringUtils
                    .hasText(dbProperties.getHost()) ? dbProperties.getHost() : defaultAddress.getHost(),
                            dbProperties.getPort() != null ? dbProperties.getPort().intValue() : defaultAddress.getPort());
    final ArrayList<ServerAddress> seeds = new ArrayList<>(1);
    seeds.add(addr);
    // test FIXME: settare da properties
    if (host2 != null) seeds.add(new ServerAddress(host2, dbProperties.getPort()));
    if (host3 != null)  seeds.add(new ServerAddress(host3, dbProperties.getPort()));

    String database = (this.dbProperties.getAuthenticationDatabase() != null)
            ? this.dbProperties.getAuthenticationDatabase() : this.dbProperties.getMongoClientDatabase();

    final MongoCredential cred;
    if (dbProperties.getUsername() != null) 
        cred = MongoCredential.createCredential(dbProperties.getUsername(), database, dbProperties.getPassword());              
    else cred = null; 
    final MongoClientOptions opt = MongoClientOptions.builder()
            .retryWrites(true)
            .maxConnectionIdleTime(MAX_CONNECTION_IDLE_TIMES)
            .maxConnectionLifeTime(MAX_CONNECTION_LIFE_TIMES)
            .sslEnabled(true)
            .writeConcern(WriteConcern.ACKNOWLEDGED)
            .build();

    return cred != null ? new MongoClient(seeds, cred, opt) : new MongoClient(seeds, opt);
}

@Override
protected String getDatabaseName() {
    return dbProperties.getMongoClientDatabase();
}

}

标签: springmongodbspring-data

解决方案


推荐阅读