精华内容
下载资源
问答
  • 主要介绍了Spring-boot集成pg、mongo多数据源过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Mongo多数据源操作

    2020-06-11 20:07:33
    项目中遇到Mongo多数据源操作,网上查找资料,做一个总结。项目框架:SpringBoot 配置文件 #mongdb data: mongodb: primary: host: localhost port: 27017 database: jury secondary: host: localhost ...

    项目中遇到Mongo多数据源操作,网上查找资料,做一个总结。项目框架:SpringBoot 

    • 配置文件
      #mongdb
      data:
        mongodb:
          primary:
            host: localhost
            port: 27017
            database: jury
          secondary:
            host: localhost
            port: 27017
            database: DM

    config文件

    MultipleMongoConfig.java
    package com.ps.jury.stream.dao.config;
    
    import com.mongodb.MongoClient;
    import com.mongodb.MongoClientURI;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.mongo.MongoProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.data.mongodb.MongoDbFactory;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
    import org.springframework.util.StringUtils;
    
    /**
     * @author yds
     * @version 1.0
     * @description:
     * @date 2020/5/29 0029 下午 17:06
     */
    @Configuration
    public class MultipleMongoConfig {
    
        @Autowired
        private MultipleMongoProperties mongoProperties;
    
        @Primary
        @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
        public MongoTemplate primaryMongoTemplate() {
            return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
        }
    
        @Bean
        @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
        public MongoTemplate secondaryMongoTemplate() {
            return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
        }
    
        @Bean
        @Primary
        public MongoDbFactory primaryFactory(MongoProperties mongo) {
            if (StringUtils.isEmpty(mongo.getUsername()) || mongo.getPassword() == null) {
                return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                        mongo.getDatabase());
            } else {
                String password = String.valueOf(mongo.getPassword());
                String url = "mongodb://" + mongo.getUsername()
                        + ":" + password
                        + "@" + mongo.getHost() + ":" + mongo.getPort() + "/" + mongo.getDatabase()
                        + "?authSource=admin&authMechanism=SCRAM-SHA-1";
                return new SimpleMongoDbFactory(new MongoClientURI(url));
            }
        }
    
        @Bean
        public MongoDbFactory secondaryFactory(MongoProperties mongo) {
            if (StringUtils.isEmpty(mongo.getUsername()) || mongo.getPassword() == null) {
                return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                        mongo.getDatabase());
            } else {
                String password = String.valueOf(mongo.getPassword());
                String url = "mongodb://" + mongo.getUsername()
                        + ":" + password
                        + "@" + mongo.getHost() + ":" + mongo.getPort() + "/" + mongo.getDatabase()
                        + "?authSource=admin&authMechanism=SCRAM-SHA-1";
                return new SimpleMongoDbFactory(new MongoClientURI(url));
            }
        }
    
    }
    MultipleMongoProperties.java
    package com.ps.jury.stream.dao.config;
    
    import lombok.Data;
    import org.springframework.boot.autoconfigure.mongo.MongoProperties;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    /**
     * @author yds
     * @version 1.0
     * @description:
     * @date 2020/5/29 0029 下午 16:55
     */
    @Data
    @Component
    @ConfigurationProperties(prefix = "spring.data.mongodb")
    public class MultipleMongoProperties {
        private MongoProperties primary = new MongoProperties();
    
        private MongoProperties secondary = new MongoProperties();
    
    }
    
    PrimaryMongoConfig.java
    package com.ps.jury.stream.dao.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
    
    /**
     * @author yds
     * @version 1.0
     * @description:
     * @date 2020/5/29 0029 下午 17:04
     */
    @Configuration
    @EnableMongoRepositories(mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
    public class PrimaryMongoConfig {
        public static final String MONGO_TEMPLATE = "primaryMongoTemplate";
    }
    
    SecondaryMongoConfig.java
    package com.ps.jury.stream.dao.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
    
    /**
     * @author yds
     * @version 1.0
     * @description:
     * @date 2020/5/29 0029 下午 17:05
     */
    
    @Configuration
    @EnableMongoRepositories(mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
    public class SecondaryMongoConfig {
        public static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
    
    }
    

    使用:

    说明:

    @Autowired 注入:默认第一数据源, @Resource:指定数据源
    package com.ps.jury.stream.dao.mongodao;
    
    import com.ps.jury.stream.common.constant.MongoConstant;
    import com.ps.jury.stream.dao.config.SecondaryMongoConfig;
    import com.ps.jury.stream.dao.dto.var.IndBlackList;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author yds
     * @version 1.0
     * @description:
     * @date 2020/5/29 0029 下午 17:41
     */
    @Service
    public class VarseelctImpl<T> implements VarSelect<T> {
    
        /**
         * MD库
         */
        @Resource(name = SecondaryMongoConfig.MONGO_TEMPLATE)
        private MongoTemplate mongoTemplate;
    
    
        @Override
        public IndBlackList selectBk(String category, String level, String value) {
            List<IndBlackList> indBlackLists = mongoTemplate.find(
                    new Query(Criteria
                            .where("blacklist_category").is(category)
                            .and("blacklist_level").is(level)
                            .and("blacklist_value").is(value)), IndBlackList.class, MongoConstant.IND_BLACKLIST);
            if (indBlackLists.size() > 0) {
                return indBlackLists.get(0);
            }
            return null;
        }
    
        @Override
        public List<IndBlackList> getAllbk() {
            List<IndBlackList> all = mongoTemplate.findAll(IndBlackList.class, "ind_blacklist");
            return all;
        }
    }
    

     

    展开全文
  • 关于mongo多数据源的处理 hello,各位小伙伴大家好,我是小王子~,一名JAVA搬砖程序员,今天给大家分享一下,在项目过程中碰到的一个小问题吧。 大家都知道mongo是一个非关系型数据库,在mongo里面我们通过指定的...

    关于mongo多数据源的处理

    hello,各位小伙伴大家好,我是小王子~,一名JAVA搬砖程序员,今天给大家分享一下,在项目过程中碰到的一个小问题吧。

    大家都知道mongo是一个非关系型数据库,在mongo里面我们通过指定的database去里面找到对应的collection,具体的话就是用到MongoTemplate模板对象去进行对mongo的crud操作了。

    那么在使用过程中,碰到了mongo的多数据源操作,该如何处理呢?

    1、定义对应的配置文件

    首先我们在properties文件中去配置以下图片内容。
    在这里插入图片描述
    如图所示的内容就是两个数据源的配置了,

    两个及以上的可以依次类推,比葫芦画瓢。

    2、创建一个读取配置文件的类

    @Component
    //从配置文件中读取开头为mongodb的配置属性
    @ConfigurationProperties(prefix = "mongodb")
    public class MultipleMongoProperties {
    
        private MongoProperties primary = new MongoProperties();
    
        //如果有第三个就一次定义和进行set和get赋值处理,**比葫芦画瓢以此类推**
    
        private MongoProperties secondary = new MongoProperties();
    
        public MongoProperties getPrimary() {
            return primary;
        }
    
        public void setPrimary(MongoProperties primary) {
            this.primary = primary;
        }
    
        public MongoProperties getSecondary() {
            return secondary;
        }
    
        public void setSecondary(MongoProperties secondary) {
            this.secondary = secondary;
        }
    }
    
    // An highlighted block
    @Component
    //从配置文件中读取开头为mongodb的配置属性
    @ConfigurationProperties(prefix = "mongodb")
    public class MultipleMongoProperties {
    
        private MongoProperties primary = new MongoProperties();
    
        private MongoProperties secondary = new MongoProperties();
        
        //如果有第三个就一次定义和进行set和get赋值处理,**比葫芦画瓢以此类推**
    
        public MongoProperties getPrimary() {
            return primary;
        }
    
        public void setPrimary(MongoProperties primary) {
            this.primary = primary;
        }
    
        public MongoProperties getSecondary() {
            return secondary;
        }
    
        public void setSecondary(MongoProperties secondary) {
            this.secondary = secondary;
        }
    }
    

    3、创建数据源对应的mongotemplate配置类

    下图是自定义的第二个数据源,然后其他数据源类似,比葫芦画瓢。

    @Configuration
    //代表的是我们自定义的mongoTemplate模板对象
    @EnableMongoRepositories(mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
    public class SecondaryMongoConfig {
        public static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
    }
    
    // An highlighted block
    @Configuration
    //代表的是我们自定义的mongoTemplate模板对象
    @EnableMongoRepositories(mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
    public class SecondaryMongoConfig {
        public static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
    }
    

    4、实现Bean注入自定义的mongoTemplate对象

    最后一步,也是最重要的一步。

    @Configuration
    public class MultipleMongoConfig {
    
        //首先对我们创建的读取mongo配置文件的类进行注入
        @Autowired
        private MultipleMongoProperties mongoProperties;
    
    	//一定要定义一个主数据源,也就是primary数据源,我们直接和配置文件保持一致即可。
        @Primary
        //这个注入的名称就是我们已经定义的mongoTemplate的name。
        @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
        public MongoTemplate primaryMongoTemplate() throws Exception {
            MongoProperties primary = this.mongoProperties.getPrimary();
            String uri = primary.getUri();
            MongoClientURI mongoClientURI = new MongoClientURI(uri);
            //此方式是通过mongo的URI方式进行连接
            MongoClient mongoClient = new MongoClient(mongoClientURI);
            return new MongoTemplate(mongoClient, primary.getDatabase());
        }
    
    	//注入其他数据源的操作。
        @Bean
        //定义其他数据源的名称。
        @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
        public MongoTemplate secondaryMongoTemplate() throws Exception {
            MongoProperties secondary = this.mongoProperties.getSecondary();
            String uri = secondary.getUri();
            MongoClientURI mongoClientURI = new MongoClientURI(uri);
            //同样的,此方式是通过mongo的URI方式进行连接
            MongoClient mongoClient = new MongoClient(mongoClientURI);
            return new MongoTemplate(mongoClient, secondary.getDatabase());
        }
    }
    
    // An highlighted block
    @Configuration
    public class MultipleMongoConfig {
    
        //首先对我们创建的读取mongo配置文件的类进行注入
        @Autowired
        private MultipleMongoProperties mongoProperties;
    
    	//一定要定义一个主数据源,也就是primary数据源,我们直接和配置文件保持一致即可。
        @Primary
        //这个注入的名称就是我们已经定义的mongoTemplate的name。
        @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
        public MongoTemplate primaryMongoTemplate() throws Exception {
            MongoProperties primary = this.mongoProperties.getPrimary();
            String uri = primary.getUri();
            MongoClientURI mongoClientURI = new MongoClientURI(uri);
            //此方式是通过mongo的URI方式进行连接
            MongoClient mongoClient = new MongoClient(mongoClientURI);
            return new MongoTemplate(mongoClient, primary.getDatabase());
        }
    
    	//注入其他数据源的操作。
        @Bean
        //定义其他数据源的名称。
        @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
        public MongoTemplate secondaryMongoTemplate() throws Exception {
            MongoProperties secondary = this.mongoProperties.getSecondary();
            String uri = secondary.getUri();
            MongoClientURI mongoClientURI = new MongoClientURI(uri);
            //同样的,此方式是通过mongo的URI方式进行连接
            MongoClient mongoClient = new MongoClient(mongoClientURI);
            return new MongoTemplate(mongoClient, secondary.getDatabase());
        }
    }
    

    Finally:以上是关于mongo多数据源的配置,如果有哪里没有提及到的地方,还请各位大佬补充和指教,作者在这里谢过各位大佬!

    Everyone have a good dream,If you want,and do it,The dream will come true In the fruture.

    Last but not least,
    注:转载请联系作者!
    WeChat:13160339561

    展开全文
  • 项目里面需要用到mongo数据源配置 问题解决: 根据不同mongo数据源配置不同mongoTemplate就可以了 代码层面: mongo maven 依赖: <dependency> <groupId>org.springframework.boot</...

    问题场景:

    项目里面需要用到多个mongo数据源配置

    问题解决:

    根据不同mongo数据源配置不同mongoTemplate就可以了

    代码层面:

    mongo maven 依赖:

     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
            </dependency>
    MongodbAutoConfig,这里配置了两个数据源,同时对默认的Risk mongTemplate还进行了自定义转换器配置,以解决mongo对decimal类型存在的读写问题
    @Configuration
    public class MongodbAutoConfig {
        @Value("${spring.data.mongodb.risk-manager-uri}")
        private String riskManagerUri;
    
        @Value("${spring.data.mongodb.tnaot-uri}")
        private String tnaotUri;
    
        @Bean(name = "mongoTemplate")
        @Primary
        public MongoTemplate mongoTemplate() {
            MongoTemplate mongoTemplateNew=new MongoTemplate(this.getRiskdbFactory(), this.mappingMongoConverter());
            return mongoTemplateNew;
        }
    
        @Bean
        @Primary
        public MongoDbFactory getRiskdbFactory()  {
            return new SimpleMongoDbFactory(new MongoClientURI(riskManagerUri));
        }
    
    
        @Bean(name = "recommendMongoTemplate")
        public MongoTemplate recommendMongoTemplate() {
            MongoClientURI mongoClientUri = new MongoClientURI(tnaotUri);
            MongoClient mongoClient = new MongoClient(mongoClientUri);
            return new MongoTemplate(mongoClient, mongoClientUri.getDatabase());
        }
    
        /**
         * mongoCustomConversions会由spring进行管理,
         * 按照加入的转换器,在数据库读写时对数据类型进行转换
         *
         * @return
         */
        @Bean
        public MappingMongoConverter mappingMongoConverter()  {
            DefaultDbRefResolver dbRefResolver = new DefaultDbRefResolver(this.getRiskdbFactory());
            MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver,new MongoMappingContext());
            List<Object> list = new ArrayList<>();
            //自定义的类型转换器
            list.add(new BigDecimalToDecimal128Converter());
            list.add(new Decimal128ToBigDecimalConverter());
            converter.setCustomConversions(new MongoCustomConversions(list));
            return converter;
        }
    
    
    }
    
    import org.bson.types.Decimal128;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.data.convert.WritingConverter;
    
    import java.math.BigDecimal;
    
    /**
     * java-->mongo  即BigDecimal变为Decimal128的转换器
     */
    @WritingConverter
    public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128> {
        @Override
        public Decimal128 convert(BigDecimal bigDecimal) {
            return new Decimal128(bigDecimal);
        }
    }
    import org.bson.types.Decimal128;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.data.convert.ReadingConverter;
    
    import java.math.BigDecimal;
    
    /**
     * mongo--->java  即Decimal128变为BigDecimal的转换器
     */
    @ReadingConverter
    public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal> {
        @Override
        public BigDecimal convert(Decimal128 decimal128) {
            return decimal128.bigDecimalValue();
        }
    }
    

    使用@Resource使用不同的数据源,下面是默认使用@primary的数据源,如果 想使用另外一个数据源@Resource("recommendMongoTemplate")就可以啦

    @Resource
    private MongoTemplate mongoOperations;
    
    
     public List<MediaSubsidyDetailMonth> getMediaDetailMonth(Long memberId,String dt){
            QueryBuilder queryBuilder = new QueryBuilder();
            queryBuilder.and("memberId").is(memberId);
            if(dt!=null) {
                queryBuilder.and("dt").is(dt);
            }
            List<MediaSubsidyDetailMonth> resultList = mongoOperations.find(new BasicQuery(queryBuilder.get().toString()),
                    MediaSubsidyDetailMonth.class);
            return resultList;
        }

    希望能帮助你解决问题,有问题欢迎留言!

    展开全文
  • 参考链接 参考与csdn以为大佬的...第一步 添加mongo依赖 版本号统一在父pom管理 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data...

    参考链接
    感谢大佬们的分享

    第一步 添加mongo依赖

    版本号统一在父pom管理

    		<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
                <scope>provided</scope>
            </dependency>
    

    多数据源需要使用配置注入 导入依赖

      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
    

    这里主要是使用 @ConfigurationProperties 这个注解 不然会报错

    第二步 配置yml

    普通的单数据源的yml配置我们是这样的

      data:
        mongodb:
          uri: mongodb://账号:密码@ip:端口号/数据库名
    

    多数据源我们就要在这里做些文章了

    spring:
      data:
        mongodb:
          自定义参数1:
            uri: mongodb://账号:密码@ip:端口号/数据库名1
          自定义参数2:
            uri: mongodb://账号:密码@ip:端口号/数据库名2
    

    这里的自定义参数 我们后面使用

    第三步通过工厂模式

    装配bean方式将yml我们的配置文件的多数据源进行使用

    创建mongo数据源工厂
    注意事项 一定不要忘写@data注解 不然运行会报错

    @Data
    public abstract class AbstractMongoConfig {
    
    
        private String uri;
    
        /*
         * Method that creates MongoDbFactory Common to both of the MongoDb
         * connections
         */
        public MongoDbFactory mongoDbFactory() throws Exception {
    
            return new SimpleMongoDbFactory(new MongoClientURI(uri));
        }
    
        /*
         * Factory method to create the MongoTemplate
         */
        abstract public MongoTemplate getMongoTemplate() throws Exception;
    
    }
    

    然后创建不同数据库的生成工厂

    @Configuration
    @ConfigurationProperties(prefix = "spring.data.mongodb.自定义参数1")
    @Component
    public class CommunityMongoConfig extends AbstractMongoConfig {
    
    
    	@Primary
        @Bean(name = "template1")
        @Override
        public MongoTemplate getMongoTemplate() throws Exception {
            return new MongoTemplate(mongoDbFactory());
        }
    
    }
    

    这里我们在上面引用yml配置的工厂 下面自定义一个参数 在注入bean的时候进行区分调用的是哪一个数据库

    重点 这里还有一个@Primary 注解 多个数据库工厂只有一个这个注解 表示默认使用的数据库

    @Configuration
    @ConfigurationProperties(prefix = "spring.data.mongodb.自定义参数2")
    @Component
    public class CommunityMongoConfig extends AbstractMongoConfig {
    
         @Bean(name = "template1")
        @Override
        public MongoTemplate getMongoTemplate() throws Exception {
            return new MongoTemplate(mongoDbFactory());
        }
    
    }
    

    **

    最后 使用

    **

    @Service
    @Slf4j
    public class OrderManageServiceImpl implements IOrderManageSerive {
    
    	@Autowired
    	@Qualifier("template1")
    	private MongoTemplate mongoTemplate;
    
    	@Autowired
    	@Qualifier("template2")
    	private MongoTemplate communityMongoTemplate;
    }
    

    参数一定要对应起来,假使使用mongoRepository 我现在只研究可以这样使用默认的 多了 没研究出来。。

    展开全文
  • Spring boot项目引入mongo多数据源配置

    千次阅读 2019-08-19 15:49:23
    Spring boot项目引入mongo多数据源配置 首先Spring boot引入mongo单数据源很好做,引入 spring-boot-starter-data-mongodb然后配置文件增加spring.data.mongodb.uri=xxx配置就行了。在调用的时候注入mongo...
  • 第一次接触配置mongodb的多数据源,与自动装配的单数据源mongodb配置有些差距,在大神的指导下才完成的,愁人啊,用到了禁止springboot自动装配,还是看代码吧(单数据源多数据源最大的区别在于springboot默认使用...
  • 但如果项目中使用到了mongo数据源,那mongo的配置就不能这么写了,我的项目中使用到了三个mongo数据源,所以我的配置是这样的: 定义配置类接收mongo数据原地址,循环创建mongo链接并保存到内存中 这样...
  • import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoDbFactory; public abstract class AbstractMongoConfigure { private String host, ...
  • (十)springboot整合mongo多数据源

    千次阅读 2018-07-27 10:00:53
    介绍 : 在当前流行的NoSql数据库中,MongoDB是大家接触比较早和用的比较的数据库。MongoDB是文档型的NoSql数据库,具有大数据量、高并发等优势,但缺点是不能建立实体关系,而且也没有事物管理机制。 1 引入...
  • MongoTemplate mongoTemplate; 19 20 public void insert(Object o, String collectionName) { 21 mongoTemplate.insert(o, collectionName); 22 } 23 24 public <T> T findOne(Query ...
  • MongoTemplate firstMongoTemplate ( ) throws Exception { return new MongoTemplate ( firstFactory ( this . mongoProperties ) ) ; } @Bean @Primary public MongoDbFactory firstFactory...
  • 项目当中有时候一个业务需要用到个数据源,但是又不是微服务的形式,要在一个项目当中配置mongo数据源,如何配置呢?1.springboot 资源文件(两个mongo地址):spring.data.mongodb.primary.uri=mongodb://192...
  • 获取MongoTemplate的逻辑(数据源需要事先全部配置好,并对应写死的key,如下dao1,dao2),主要是参考网上的写法适当做修改:http://blog.csdn.net/qq994406030/article/details/52861421。aop拦截提供统一的代码,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,944
精华内容 4,777
关键字:

mongo多数据源