1

J'ai besoin d'écrire une propre implémentation de "com.mongodb.MongoClient" afin d'ajouter les informations d'identification DB à la volée dans MongoTemplate.

C'est parce que:
- nous travaillons sur une application mutualisée et les bases de données sont créées à la volée.
- tout en autowiring le MongoTemplate (au démarrage du serveur), la liste des informations d'identification passée à MongoClient serait en train de changer.
- à chaque fois, lorsqu'un nouveau locataire est ajouté, nous ne pouvons pas réinjecter le MongoTemplate existant.
- également, nous devons utiliser un pool de connexions partagées entre tous les locataires, par conséquent, nous ne pouvons pas utiliser un MongoTemplate différent pour chaque locataire. Puis-je écrire mon implémentation personnalisée de MongoClient? Si oui, comment il devrait être mis en œuvre pour répondre aux informations d'identification DB à la volée? Notez que le "credentialsList" transmis au constructeur "com.mongodb.MongoClient" est converti en "unmodifiableList", de sorte qu'il n'a pas pu être mis à jour.Implémentation personnalisée du pilote Java MongoDB

Merci!

Répondre

0

Vous pouvez écrire votre propre MongoClient en étendant la classe mais est-ce vraiment nécessaire? Pas nécessairement.

  1. MongoClientOptions fournit la liste des propriétés que vous pouvez configurer

  2. Faire usage de suivre constructeur de MongoClient

    MongoClient publique (Liste serveraddress, Liste credentialsList, MongoClientOptions options) { super (graines , credentialsList, options); }

pour passer la liste des références, la liste des adresses des serveurs et de leurs options.

  1. Créer une SimpleMongoDBFactory utilisant le MongoClient

  2. Enfin utiliser MongoDbFactory pour créer un MongoTemplate

Pour mettre tous ensemble:

@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; 

    } 
+0

Oui, merci! Mais dites-vous chaque fois que chaque locataire crée une instance distincte de MongoClient? Si oui, cela vous aidera-t-il pour le pool de connexions partagé? Si non, comment puis-je mettre à jour le credentialList passé à MongoClient avec de nouvelles informations d'identification pour une nouvelle base de données ajoutée à la volée? –

+1

cela dépend de vos besoins, si vous créez une connexion à la volée, alors vous devez créer un nouveau Mongoclient à chaque fois en passant les informations d'identification et ensuite faire les opérations. Mais comme vous voyez les informations d'identification utilisées par le processus mongo, les constantes ne peuvent pas être ajoutées à la volée. Il est donc préférable de disposer d'un ensemble d'informations d'identification avant de créer MongClient. Dans le cas où votre exigence est de créer mongoClient à la volée avec des informations d'identification diff, vous pouvez implémenter ce scénario en utilisant un modèle de conception dans lequel vous pouvez gérer différents MongoClients avec des informations d'identification comme clé. – Barath