• springboot整合mongo多数据源


    该实例已测试

    POM.XML

     <!-- Spring Boot mongodb 依赖-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-mongodb</artifactId>
     </dependency>

    application.yml

     1  data:
     2         mongodb:
     3             primary:
     4                 uri: 192.168.0.103:27870
     5                 database: 
     6                 username: 
     7                 password: 
     8                 authentication-database: 
     9             second:
    10                 uri: 192.168.0.103:27870
    11                 database: 
    12                 username: 
    13                 password: 
    14                 authentication-database: 
    15             connectionsPerHost: 10
    16             options:
    17                 min-connections-per-host: 8
    18                 threads-allowed-to-block-for-connection-multiplier: 4
    19                 max-wait-time: 1500
    20                 socket-timeout: 1500

    AbstractMongoConfig

      1 package com.haoyun.common.config.mongo;
      2 
      3 import com.mongodb.MongoClient;
      4 import com.mongodb.MongoClientOptions;
      5 import com.mongodb.MongoCredential;
      6 import com.mongodb.ServerAddress;
      7 import org.springframework.beans.factory.annotation.Value;
      8 import org.springframework.data.mongodb.MongoDbFactory;
      9 import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
     10 
     11 import java.util.ArrayList;
     12 import java.util.List;
     13 
     14 public class AbstractMongoConfig {
     15 
     16     protected List<String>    uri;
     17     protected String          username;
     18     protected String          password;
     19     protected String          authenticationDatabase;
     20     protected String          database;
     21 
     22     @Value("${spring.data.mongodb.connectionsPerHost}")
     23     private Integer connectionsPerHost;
     24 
     25     @Value("${spring.data.mongodb.options.min-connections-per-host}")
     26     private Integer minConnectionsPerHost;
     27 
     28     @Value("${spring.data.mongodb.options.threads-allowed-to-block-for-connection-multiplier}")
     29     private Integer threadsAllowedToBlockForConnectionMultiplier;
     30 
     31     @Value("${spring.data.mongodb.options.max-wait-time}")
     32     private Integer maxWaitTime;
     33 
     34     @Value("${spring.data.mongodb.options.socket-timeout}")
     35     private Integer socketTimeout;
     36 
     37     //覆盖默认的MongoDbFacotry
     38     public MongoDbFactory mongoDbFactory() {
     39         //客户端配置(连接数、副本集群验证)
     40         MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
     41         builder.connectionsPerHost(this.connectionsPerHost);
     42         builder.minConnectionsPerHost(this.minConnectionsPerHost);
     43         builder.threadsAllowedToBlockForConnectionMultiplier(this.threadsAllowedToBlockForConnectionMultiplier);
     44         builder.maxWaitTime(this.maxWaitTime);
     45         builder.socketTimeout(this.socketTimeout);
     46 
     47         MongoClientOptions mongoClientOptions = builder.build();
     48 
     49         List<ServerAddress> serverAddresses = new ArrayList<>();
     50         List<String> address = this.uri;
     51         for (String add : address) {
     52             String[] str = add.split(":");
     53             ServerAddress serverAddress = new ServerAddress(str[0], Integer.parseInt(str[1]));
     54             serverAddresses.add(serverAddress);
     55         }
     56 
     57         // 连接认证
     58         List<MongoCredential> mongoCredentialList = new ArrayList<>();
     59         if (this.username != null) {
     60             mongoCredentialList.add(MongoCredential.createScramSha1Credential(
     61                     this.username,
     62                     this.authenticationDatabase != null ? this.authenticationDatabase : this.database,
     63                     this.password.toCharArray()));
     64         }
     65         System.out.println("mongoCredentialList:" + mongoCredentialList.toString());
     66 
     67         //创建客户端和Factory
     68         MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredentialList, mongoClientOptions);
     69         MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, this.database);
     70 
     71         return mongoDbFactory;
     72     }
     73 
     74     public List<String> getUri() {
     75         return uri;
     76     }
     77 
     78     public void setUri(List<String> uri) {
     79         this.uri = uri;
     80     }
     81 
     82     public String getUsername() {
     83         return username;
     84     }
     85 
     86     public void setUsername(String username) {
     87         this.username = username;
     88     }
     89 
     90     public String getPassword() {
     91         return password;
     92     }
     93 
     94     public void setPassword(String password) {
     95         this.password = password;
     96     }
     97 
     98     public String getAuthenticationDatabase() {
     99         return authenticationDatabase;
    100     }
    101 
    102     public void setAuthenticationDatabase(String authenticationDatabase) {
    103         this.authenticationDatabase = authenticationDatabase;
    104     }
    105 
    106     public String getDatabase() {
    107         return database;
    108     }
    109 
    110     public void setDatabase(String database) {
    111         this.database = database;
    112     }
    113 }

    PrimaryMongoConfig

     1 package com.haoyun.common.config.mongo;
     2 
     3 import org.springframework.boot.context.properties.ConfigurationProperties;
     4 import org.springframework.context.annotation.Bean;
     5 import org.springframework.context.annotation.Configuration;
     6 import org.springframework.context.annotation.Primary;
     7 import org.springframework.data.mongodb.core.MongoTemplate;
     8 
     9 /**
    10  * @author milicool
    11  * Created on 2018/11/26
    12  */
    13 @Configuration
    14 @ConfigurationProperties(prefix = "spring.data.mongodb.primary")
    15 public class PrimaryMongoConfig extends AbstractMongoConfig {
    16 
    17     @Primary
    18     @Bean(name = "mongoTemplate")
    19     public MongoTemplate getMongoTemplate() {
    20         return new MongoTemplate(mongoDbFactory());
    21     }
    22 }

    SecondMongoConfig

     1 package com.haoyun.common.config.mongo;
     2 
     3 import org.springframework.boot.context.properties.ConfigurationProperties;
     4 import org.springframework.context.annotation.Bean;
     5 import org.springframework.context.annotation.Configuration;
     6 import org.springframework.data.mongodb.core.MongoTemplate;
     7 
     8 /**
     9  * @author milicool
    10  * Created on 2018/11/26
    11  */
    12 @Configuration
    13 @ConfigurationProperties(prefix="spring.data.mongodb.second")
    14 public class SecondMongoConfig extends AbstractMongoConfig {
    15 
    16     @Bean(name = "secondMmongoTemplate")
    17     public MongoTemplate getMongoTemplate() {
    18         return new MongoTemplate(mongoDbFactory());
    19     }
    20 }

    MongoDao

     1 package com.haoyun.common.jdbc;
     2 
     3 import com.mongodb.client.result.UpdateResult;
     4 import org.springframework.data.mongodb.core.MongoTemplate;
     5 import org.springframework.data.mongodb.core.aggregation.Aggregation;
     6 import org.springframework.data.mongodb.core.query.Query;
     7 import org.springframework.data.mongodb.core.query.Update;
     8 import org.springframework.stereotype.Repository;
     9 
    10 import javax.annotation.Resource;
    11 import java.util.List;
    12 
    13 
    14 @Repository("mongoDao")
    15 public class MongoDao {
    16 
    17     @Resource(name = "mongoTemplate")
    18     private MongoTemplate mongoTemplate;
    19 
    20     public void insert(Object o, String collectionName) {
    21         mongoTemplate.insert(o, collectionName);
    22     }
    23 
    24     public <T> T findOne(Query query, String collectionName, Class<T> clazz) {
    25         return mongoTemplate.findOne(query, clazz, collectionName);
    26     }
    27 
    28     public <T> List<T> findAll(Query query, String collectionName, Class<T> clazz) {
    29         return mongoTemplate.find(query, clazz, collectionName);
    30     }
    31 
    32     public int update(Query query, Update update, String collectionName) {
    33         UpdateResult writeResult = mongoTemplate.upsert(query, update, collectionName);
    34         return (int) writeResult.getModifiedCount();
    35     }
    36 
    37     public void createCollection(String collectionName) {
    38         mongoTemplate.createCollection(collectionName);
    39     }
    40 
    41     public <T> void remove(Query query, String collectionName) {
    42         mongoTemplate.remove(query, collectionName);
    43     }
    44 
    45     public long count(Query query, String collectionName) {
    46         return mongoTemplate.count(query, collectionName);
    47     }
    48 
    49     public <T> T findAndModify(Query query, Update update, String collectionName, Class<T> clazz) {
    50         return mongoTemplate.findAndModify(query, update, clazz, collectionName);
    51     }
    52 
    53     public <T> List<T> findAggregation(Aggregation agg, String collectionName, Class<T> clazz) {
    54         return mongoTemplate.aggregate(agg, collectionName, clazz).getMappedResults();
    55     }
    56 
    57 
    58 }

    SecondMongoDao

    package com.haoyun.common.jdbc;
    
    import com.mongodb.client.result.UpdateResult;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.aggregation.Aggregation;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    import org.springframework.stereotype.Repository;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Repository("secondMongoDao")
    public class SecondMongoDao {
    
        @Resource(name = "secondMmongoTemplate")
        private MongoTemplate mongoTemplate;
    
        public void insert(Object o, String collectionName) {
            mongoTemplate.insert(o, collectionName);
        }
    
        public <T> T findOne(Query query, String collectionName, Class<T> clazz) {
            return mongoTemplate.findOne(query, clazz, collectionName);
        }
    
        public <T> List<T> findAll(Query query, String collectionName, Class<T> clazz) {
            return mongoTemplate.find(query, clazz, collectionName);
        }
    
        public int update(Query query, Update update, String collectionName) {
            UpdateResult writeResult = mongoTemplate.upsert(query, update, collectionName);
            return (int) writeResult.getModifiedCount();
        }
    
        public void createCollection(String collectionName) {
            mongoTemplate.createCollection(collectionName);
        }
    
        public <T> void remove(Query query, String collectionName) {
            mongoTemplate.remove(query, collectionName);
        }
    
        public long count(Query query, String collectionName) {
            return mongoTemplate.count(query, collectionName);
        }
    
        public <T> T findAndModify(Query query, Update update, String collectionName, Class<T> clazz) {
            return mongoTemplate.findAndModify(query, update, clazz, collectionName);
        }
    
        public <T> List<T> findAggregation(Aggregation agg, String collectionName, Class<T> clazz) {
            return mongoTemplate.aggregate(agg, collectionName, clazz).getMappedResults();
        }
    
    
    }

    引入

    测试

    结语

    有两处不爽的地方,为啥加一个数据源就要多个config和Dao, 所有的都公用一个行不行?(待优化)

    长路漫漫, 走过了村落, 却忘记了你的脸庞

  • 相关阅读:
    ubuntu: 环境搭建
    [转]unable to resolve superclass of 的奇怪问题和一种解决方法!
    [转]如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?
    [转]TCP、UDP数据包大小的确定
    [转]教大家如何打造使用Tcpview(tcp查看器
    [转]帐号登录事件(事件编号与描述)
    [转]一个基于完成端口的TCP Server Framework,浅析IOCP
    [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
    mysql5.5 Replication 主从同步
    [转]adb pull Permission denied及no such file错误
  • 原文地址:https://www.cnblogs.com/milicool/p/10021681.html
Copyright © 2020-2023  润新知