Несколько баз данных с Spring Boot MongoDB Repositories динамически - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно было изменить приложение Spring-Boot, чтобы динамически управлять экземплярами драйвера Mongo.В моем приложении Spring Boot MongoDB Repositories уже настроен, теперь в соотв.к новому требованию мы хотим внедрить sass (динамически арендатор), в котором один из них является master db, а другой db динамически выбирает db.Теперь проблема заключается в том, как настроить весеннюю загрузку другого репозитория MongoDB динамически в приложении, когда мы выбираем любого клиента.Например: предположим, что 5 арендаторов динамически выбирают любую из них внутри приложения, а другая БД выбирается случайным образом

1 Ответ

0 голосов
/ 31 октября 2018
        DyanamicRepository dyanmicRepositry=CustomMongoDbMongoRepositoryFactoryClass.getRepository(Pass_DyanamicRepository.class, Pass_DynamicDataBaseName);
        dyanmicRepositry.save(dealer);

        ******************************************


        import java.io.Serializable;
        import java.util.HashMap;
        import java.util.Map;
        import org.springframework.data.mongodb.core.MongoOperations;
        import org.springframework.data.mongodb.core.MongoTemplate;
        import org.springframework.data.mongodb.core.convert.CustomConversions;
        import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
        import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
        import com.mongodb.Mongo;



        public final class CustomMongoDbMongoRepositoryFactoryClass {

            static final Map<String,Object> LOCK_OBJECT=new HashMap<>();                
            private static final Map<String,MongoOperations> MONGOOP_CACHE=new HashMap<>();
            private static final Map<String,Map<String,Object>> REPOS_CACHE=new HashMap<>();                        
            public static MongoOperations getMongoOperations(Vendor vendor){                                

            String database =vendor.getVendorName().replaceAll("[\\s]", "");                                        
            MongoOperations mongoOperations=MONGOOP_CACHE.get(database);
            if(mongoOperations==null){
                    Mongo mongo=ApplicationContextHolder.getContext().getBean(Mongo.class);
                    CustomConversions mappingMongoConverter=ApplicationContextHolder.getContext().getBean(CustomConversions.class);

                    MongoTemplate mm = new MongoTemplate(mongo, database);                      
                    MappingMongoConverter mmc = (MappingMongoConverter)mm.getConverter();           
                    mmc.setCustomConversions(mappingMongoConverter);
                    mmc.afterPropertiesSet();
                    mongoOperations=  mm;               
                    MONGOOP_CACHE.put(database,mongoOperations);
            }

            return mongoOperations;


        }

        public static synchronized <T extends Serializable> T getRepository(Class<T> type,Vendor vendor){

            if(vendor.getId()=="") {
                return ApplicationContextHolder.getContext().getBean(type);
            }               

            String database =vendor.getVendorName().replaceAll("[\\s]", "");
            Map<String,Object> repos=REPOS_CACHE.get(database);
            if(repos==null) {
                repos=new HashMap<>();
                REPOS_CACHE.put(database,repos);

            }                       
            if(repos.containsKey(type.getName())) {
                System.out.println("Get "+type.getName()+" Repo in ::: "+(System.currentTimeMillis()-start) +"ms");
                return (T) repos.get(type.getName());
            }           
            MongoOperations mongoOperations=getMongoOperations(vendor);         

            MongoRepositoryFactory bean=new MongoRepositoryFactory(mongoOperations);

            T repo=bean.getRepository(type);             

            repos.put(type.getName(), repo);


            return repo;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...