目录

Mongo多数据源配置

 (一) 项目背景介绍

(二) 配置文件添加新数据源配置(application.yml )

(三) 分别为每个数据源建立java实体映射配置类

(四) 分别为每个数据源配置MongoTemplate


Mongo多数据源配置

 (一) 项目背景介绍

由于项目业务 , 现需要将项目中的业务数据 与 生产数据分开存放分开查询 , 分别管理 , 故而需要配置两个数据源来满足这项业务需求 

(二) 配置文件添加新数据源配置(application.yml )

单数据源配置的具体操作 以及配置文件 已经在 前面的博客中写过  ,  MongoDB Java操作 ( 二 ) MongoDB的连接以及基础配置、连接池配置

配置文件中 <options> 相关连接池配置属性 在前文中也有提到  MongoDB Java操作 ( 二 ) MongoDB的连接以及基础配置、连接池配置

## 由于项目需要 所以在配置文件中 将password 敏感字段 修改为 secretcode
spring:
  data:
    mongodb:
      host: 192.168.207.234
      port: 27017
      database: mongo_business
      username: test001
      secretcode: test001
      authentication-database: mongo_business
      options:
        max-connections-per-host: 20
    model:
      mongodb:
        host: 192.168.207.234
        port: 27017
        database: mongo_production
        username: test002
        secretcode: test002
        authentication-database: mongo_production
        options:
          max-connections-per-host: 20

(三) 分别为每个数据源建立java实体映射配置类

 

该实体类与配置文件之间的联系 可依靠 @ConfigurationProperties 中的 prefix 指向指定配置文件前缀下的参数

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.data.mongodb")
@RefreshScope
public class MongoSettingsProperties {

    private String host;
    private Integer port;
    private String database;
    private String username;
    private String secretcode;
    private String authenticationDatabase;
/*
    // 以下为连接池配置 , 此处选择省略 , 如需使用放开即可 
    private List<String> address;
    private String replicaSet;
    private Integer minConnectionsPerHost = 0;
    private Integer maxConnectionsPerHost = 100;
    private Integer threadsAllowedToBlockForConnectionMultiplier = 5;
    private Integer serverSelectionTimeout = 30000;
    private Integer maxWaitTime = 120000;
    private Integer maxConnectionIdleTime = 0;
    private Integer maxConnectionLifeTime = 0;
    private Integer connectTimeout = 10000;
    private Integer socketTimeout = 0;
    private Boolean socketKeepAlive = false;
    private Boolean sslEnabled = false;
    private Boolean sslInvalidHostNameAllowed = false;
    private Boolean alwaysUseMBeans = false;
    private Integer heartbeatConnectTimeout = 20000;
    private Integer heartbeatSocketTimeout = 20000;
    private Integer minHeartbeatFrequency = 500;
    private Integer heartbeatFrequency = 10000;
    private Integer localThreshold = 15;*/
}

另新建生产数据mongodb配置文件的实体类 

package com.sgcc.eip.cmc.switchs.benchmark.boot.config;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.data.model.mongodb")
@RefreshScope
public class MongoDataModelProperties {

    private String host;
    private Integer port;
    private String database;
    private String username;
    private String secretcode;
    private String authenticationDatabase;
/*
    private List<String> address;
    private String replicaSet;
    private Integer minConnectionsPerHost = 0;
    private Integer maxConnectionsPerHost = 100;
    private Integer threadsAllowedToBlockForConnectionMultiplier = 5;
    private Integer serverSelectionTimeout = 30000;
    private Integer maxWaitTime = 120000;
    private Integer maxConnectionIdleTime = 0;
    private Integer maxConnectionLifeTime = 0;
    private Integer connectTimeout = 10000;
    private Integer socketTimeout = 0;
    private Boolean socketKeepAlive = false;
    private Boolean sslEnabled = false;
    private Boolean sslInvalidHostNameAllowed = false;
    private Boolean alwaysUseMBeans = false;
    private Integer heartbeatConnectTimeout = 20000;
    private Integer heartbeatSocketTimeout = 20000;
    private Integer minHeartbeatFrequency = 500;
    private Integer heartbeatFrequency = 10000;
    private Integer localThreshold = 15;*/
}

(四) 分别为每个数据源配置MongoTemplate

@Primary : 当有多个类型相同的MongoTemplate时 , 加了该注解得Bean会被当做默认依赖注入 . 例如无添加特殊注解@Qualifier进行区分也没有使用别名进行区分的情况下则默认使用加了@Primary的Bean的MongoTemplate数据源

 

@Qualifier : @Qualifier限定哪个bean应该被自动注入。当Spring无法判断出哪个bean应该被注入时,@Qualifier注解有助于消除歧义bean的自动注入

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.sgcc.eip.cmc.suite.common.log.Logger;
import com.sgcc.eip.cmc.suite.common.log.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Configuration
public class MongoConfiguration {


    @Autowired
    MongoSettingsProperties properties;

    @Autowired
    MongoDataModelProperties dataModelMongdoProperties;

    private static final Logger logger = LoggerFactory.getLogger(MongoConfiguration.class);

    // 不同数据源取不同的别名用于注入使用时区分
    @Primary
    @Bean(name = "mongoTemplate")
    public MongoTemplate getMongoTemplate() throws Exception {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(properties));
        return mongoTemplate;
    }
    // 不同数据源取不同的别名用于注入使用时区分
    @Bean(name = "dataMongoTemplate")
    public MongoTemplate getDataMongoTemplate() throws Exception {
        MongoTemplate mongoTemplate = new MongoTemplate(dataMongoDbFactory(dataModelMongdoProperties));
        return mongoTemplate;
    }

    // 配置第一个数据源的 MongoDbFactory 用来连接mongo
    @Bean
    public MongoDbFactory mongoDbFactory(MongoSettingsProperties properties) {

        // 客户端配置(连接数,副本集群验证)
        MongoClientOptions.Builder builder = new MongoClientOptions.Builder();

/*
        #####  以下为连接池配置在本篇博客中选择不启用 , 如需使用可自行放开
        builder.connectionsPerHost(properties.getMaxConnectionsPerHost());
        builder.minConnectionsPerHost(properties.getMinConnectionsPerHost());
        if (properties.getReplicaSet() != null) {
            builder.requiredReplicaSetName(properties.getReplicaSet());
        }
        builder.threadsAllowedToBlockForConnectionMultiplier(
                properties.getThreadsAllowedToBlockForConnectionMultiplier());
        builder.serverSelectionTimeout(properties.getServerSelectionTimeout());
        builder.maxWaitTime(properties.getMaxWaitTime());
        builder.maxConnectionIdleTime(properties.getMaxConnectionIdleTime());
        builder.maxConnectionLifeTime(properties.getMaxConnectionLifeTime());
        builder.connectTimeout(properties.getConnectTimeout());
        builder.socketTimeout(properties.getSocketTimeout());
        // builder.socketKeepAlive(properties.getSocketKeepAlive());
        builder.sslEnabled(properties.getSslEnabled());
        builder.sslInvalidHostNameAllowed(properties.getSslInvalidHostNameAllowed());
        builder.alwaysUseMBeans(properties.getAlwaysUseMBeans());
        builder.heartbeatFrequency(properties.getHeartbeatFrequency());
        builder.minHeartbeatFrequency(properties.getMinHeartbeatFrequency());
        builder.heartbeatConnectTimeout(properties.getHeartbeatConnectTimeout());
        builder.heartbeatSocketTimeout(properties.getHeartbeatSocketTimeout());
        builder.localThreshold(properties.getLocalThreshold());*/

        MongoClientOptions mongoClientOptions = builder.build();
        String host = properties.getHost();
        Integer port = properties.getPort();
        ServerAddress serverAddress = new ServerAddress(host, port);

        MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(properties.getUsername(),
                properties.getAuthenticationDatabase() != null ? properties.getAuthenticationDatabase() : properties.getDatabase(),
                properties.getSecretcode().toCharArray());

        // 创建非认证客户端
        MongoClient mongoClient = new MongoClient(serverAddress, mongoCredential, mongoClientOptions);

        // 创建MongoDbFactory
        MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
        return mongoDbFactory;
    }


    // // 配置第二个数据源的 MongoDbFactory 用来连接mongo
    public MongoDbFactory dataMongoDbFactory(MongoDataModelProperties properties) {

        // 客户端配置(连接数,副本集群验证)
        MongoClientOptions.Builder builder = new MongoClientOptions.Builder();

        MongoClientOptions mongoClientOptions = builder.build();


        String host = properties.getHost();
        Integer port = properties.getPort();
        ServerAddress serverAddress = new ServerAddress(host, port);

        MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(properties.getUsername(),
                properties.getAuthenticationDatabase() != null ? properties.getAuthenticationDatabase() : properties.getDatabase(),
                properties.getSecretcode().toCharArray());

        // 创建非认证客户端
        MongoClient mongoClient = new MongoClient(serverAddress, mongoCredential, mongoClientOptions);

        // 创建MongoDbFactory
        MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
        return mongoDbFactory;
    }
}