MongoDB Java驱动程序的定制实现

MongoDB Java驱动程序的定制实现,java,mongodb,connection-pooling,multi-tenant,mongotemplate,Java,Mongodb,Connection Pooling,Multi Tenant,Mongotemplate,我需要编写自己的“com.mongodb.MongoClient”实现,以便在MongoTemplate中动态添加DB凭据。 这是因为: -我们正在开发一个多租户应用程序,数据库是动态创建的 -自动连接MongoTemplate(在服务器启动时)时,传递给MongoClient的凭据列表将发生更改 -每次添加新租户时,我们都无法重新注入现有MongoTemplate -此外,我们必须在所有租户之间使用共享连接池,因此,我们不能为每个租户使用不同的MongoTemplate。 我可以写下我的Mon

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

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

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

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


谢谢

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

  • MongoClientOptions提供可以配置的属性列表

  • 使用MongoClient的以下构造函数

    公共MongoClient(列表服务器地址、列表证书列表、MongoClient选项){ 超级(种子、证书列表、选项); }

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

  • 使用MongoClient创建SimpleMongoDBFactory

  • 最后使用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,但它真的需要吗?不一定

  • MongoClientOptions提供可以配置的属性列表

  • 使用MongoClient的以下构造函数

    公共MongoClient(列表服务器地址、列表证书列表、MongoClient选项){ 超级(种子、证书列表、选项); }

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

  • 使用MongoClient创建SimpleMongoDBFactory

  • 最后使用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之前准备好一组凭据。如果您的需求是使用diff凭据动态创建mongoClient,那么您可以使用一种设计模式来实现此场景,您可以使用凭据作为密钥来维护不同的mongoClient。是的,谢谢!但您是说每次为每个租户创建一个单独的MongoClient实例吗?如果是,这是否有助于共享连接池?如果否,我如何使用动态添加的新数据库的新凭据更新传递给MongoClient的credentialList?这取决于您的要求,如果您正在动态创建连接,则每次都必须通过传递凭据来创建新的MongoClient,然后执行操作。但正如您所看到的,mongo进程使用的凭据是常量,不能动态添加。因此,最好在创建MongClient之前准备好一组凭据。如果您的需求是使用diff凭据动态创建mongoClient,那么您可以使用一种设计模式来实现此场景,在这种模式中,您可以使用凭据作为密钥来维护不同的mongoClient。