【问题标题】:Custom implementation of MongoDB Java DriverMongoDB Java Driver的自定义实现
【发布时间】:2017-01-07 20:19:36
【问题描述】:

我需要编写自己的“com.mongodb.MongoClient”实现,以便在 MongoTemplate 中动态添加数据库凭据。

这是因为:
- 我们正在开发一个多租户应用程序,并且数据库是动态创建的。
- 在自动装配 MongoTemplate 时(在服务器启动时),传递给 MongoClient 的凭据列表将发生变化。
- 每次添加新租户时,我们都无法重新注入现有的 MongoTemplate。
- 另外,我们必须在所有租户之间使用共享连接池,因此,我们不能为每个租户使用不同的 MongoTemplate。

我可以写下我的 MongoClient 自定义实现吗?如果是,应如何实施以适应动态数据库凭据更改?

请注意,传递给“com.mongodb.MongoClient”构造函数的“credentialsList”被转换为“unmodifiableList”,因此无法更新。

谢谢!!

【问题讨论】:

    标签: java mongodb connection-pooling multi-tenant mongotemplate


    【解决方案1】:

    您可以通过扩展类来编写自己的 MongoClient,但它真的需要吗?不必要。

    1. MongoClientOptions 提供了您可以配置的属性列表

    2. 利用以下MongoClient的构造函数

      public MongoClient(List serveraddress, List credentialsList, MongoClientOptions options) { 超级(种子,凭证列表,选项); }

    传递凭据列表、服务器地址列表及其选项。

    1. 使用 MongoClient 创建一个 SimpleMongoDBFactory

    2. 终于用MongoDbFactory创建了一个MongoTemplate

    把所有东西放在一起:

        @Bean(destroyMethod="close")
        MongoClient mongoClient(MongoClientOptions mongoClientOptions){
    
            MongoClient mongoClient=new MongoClient(serverAddresses(),credentails(),mongoClientOptions);
    
            return mongoClient;
        }
    
    
        @Bean
        public  MongoClientOptions mongoClientOptions(){
    
            MongoClientOptions.Builder builder = MongoClientOptions.builder();
            MongoClientOptions options=builder.sslEnabled(true).build();        
            return options;
        }
    
        @Bean
        public MongoDbFactory mongoDbFactory(MongoClientOptions mongoClientOptions) throws Exception {
            return new SimpleMongoDbFactory(mongoClient(mongoClientOptions), "yourdb");
        }
    
        @Bean
        public MongoTemplate mongoTemplate(MongoClientOptions mongoClientOptions) throws Exception {
    
            MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(mongoClientOptions));
    
            return mongoTemplate;
    
        }
    

    【讨论】:

    • 好的,谢谢!但是您是说每次为每个租户创建一个单独的 MongoClient 实例吗?如果是,这对共享连接池有帮助吗?如果不是,如何使用动态添加的新数据库的新凭据更新传递给 MongoClient 的 credentialList?
    • 这取决于您的要求,如果您正在动态创建连接,那么您必须每次通过传递凭据来创建新的 Mongoclient,然后执行操作。但正如您所见,mongo 进程使用的凭据是常量,不能即时添加。因此最好在创建 MongClient 之前准备好一组凭据。如果您的要求是使用不同的凭据动态创建 mongoClient,那么您可以使用一种设计模式来实现此场景,您可以使用凭据作为键来维护不同的 MongoClients。
    猜你喜欢
    • 2013-06-06
    • 2011-01-25
    • 2011-10-31
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多