目录
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;
}
}