【问题标题】:Spring Mongodb: configure documents to use specific dbs?Spring Mongodb:配置文档以使用特定的数据库?
【发布时间】:2017-12-03 18:33:47
【问题描述】:

我有一个基于 rest 的 spring-boot 微服务,我想将其配置为将身份验证和会话数据存储在一个 mongo 数据库中,并将应用程序数据存储在另一个数据库中。

我当前的设置大部分都有效,除了 spring 在两个数据库中创建我的所有文档。我查看了@Document()注解,但它没有供数据库使用的参数。

在 mongo shell 中:

> show dbs
admin                 0.000GB
authentication        0.000GB
prospect              0.000GB

> use authentication
switched to db authentication

> show collections
credentials
credentials_authorities
prospects
roles
sessions

> use prospect
switched to db prospect

> show collections
prospects

application.properties:

com.mycompany.prospect.domainName=mycompany.com

spring.data.mongodb.host=mongodb-service
spring.data.mongodb.port=27017

com.mycompany.prospect.server.appDatabase=prospect
com.mycompany.prospect.server.sessionDatabase=authentication

HttpSessionConfig.java

@Configuration
@EnableMongoHttpSession()
public class HttpSessionConfig {

  private final Logger logger = LoggerFactory.getLogger(this.getClass());

  @Bean
  public CookieSerializer cookieSerializer(
      @Value("${com.mycompany.prospect.domainName:localhost}")
          final String domainName) {

    logger.info("Configuring DefaultCookieSerializer with DomainName '{}'.", domainName);

    final DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setDomainName(domainName);
    serializer.setUseHttpOnlyCookie(true);
    return serializer;
  }

  @Bean
  public JdkMongoSessionConverter jdkMongoSessionConverter() {
    return new JdkMongoSessionConverter();
  }
}

MongoConfig.java

@Configuration
@EnableMongoRepositories
public class MongoConfig {

  private final Environment env;

  public MongoConfig(Environment env) {
    this.env = env;
  }

  @Bean("applicationTemplate")
  @Qualifier("applicationTemplate")
  public MongoTemplate mongoTemplate(
      final MappingMongoConverter mappingMongoConverter, final MongoClient mongoClient) {
    final String databaseName =
        env.getRequiredProperty("com.mycompany.prospect.server.appDatabase");

    final MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, databaseName);
    return new MongoTemplate(dbFactory, mappingMongoConverter);
  }

  @Bean("mongoOperations")
  @Qualifier("mongoOperations")
  @Primary
  public MongoTemplate mongoOperations(
      final MappingMongoConverter mappingMongoConverter, final MongoClient mongoClient) {
    final String databaseName =
        env.getRequiredProperty("com.mycompany.prospect.server.sessionDatabase");
    final MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, databaseName);
    final MongoTemplate mongoTemplate = new MongoTemplate(dbFactory, mappingMongoConverter);
    return mongoTemplate;
  }    
}

Prospect.java

@Document(collection = "prospects")
public class Prospect {
  @Id private String prospectId;

  @TextIndexed() private String businessName;

  public String getProspectId() {
    return prospectId;
  }

  public void setProspectId(String prospectId) {
    this.prospectId = prospectId;
  }

  public String getBusinessName() {
    return businessName;
  }

  public void setBusinessName(final String businessName) {
    this.businessName = businessName;
  }
}    

我希望潜在客户集合仅存在于潜在客户数据库中。

我尝试删除数据库并重新启动服务,但它们在重新启动时又回来了。有关如何正确执行此操作的任何想法?

【问题讨论】:

    标签: java mongodb spring-boot spring-data-mongodb spring-session


    【解决方案1】:

    如果您的应用程序指向单个 mongodb 实例,并且您希望根据每个 Web 请求切换数据库。你可以看一下这个示例, https://github.com/Loki-Afro/multi-tenant-spring-mongodb/blob/master/src/main/java/com/github/zarathustra/mongo/MultiTenantMongoDbFactory.java

    PS:- 我在研究实现多租户时发现了这个

    【讨论】:

    • 感谢您的有趣发现,但我不确定这是否/如何帮助我。
    • 解决问题的方法有2种,1)实例化单个mongoTemplate实例,在运行时切换数据库,再执行Prospect对象的保存操作(繁琐)。 2)将您的会话相关代码分离到一个模块中,并将您的应用程序域模型分离到另一个模块中。在每个模块中实例化 mongoTemplate 并将 MongoTemplate 的范围限制为仅扫描每个模块内的包,例如 @EnableMongoRepositories(basePackages = "com.module.session", mongoTemplateRef = "sessionMongoTemplate") 。这样,条目将在适当的数据库中进行。
    • 啊哈! #2 是我一直在寻找的。我认为 #1 不会起作用,因为 spring 在启动时会创建空集合。我认为这是确保正确设置索引的一部分。如果一切顺利,我会尝试 #2 并选择此答案。
    • 所以,我采用了这种方法....但是 spring 仍在会话和潜在数据库中创建集合。
    • 如果你可以在 github 上上传你的示例代码,我可以帮你看看。
    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 2016-09-03
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多