1.项目框架介绍:springboot集成spring-data-mongodb3.1.3 (内嵌mongo-driver-core4.1.1)
2.配置文件:application.yml
mongodb:
primary:
host: 192.168.1.1
port: 27017
database: database1
username: ceshi1
password: ceshi12345
secondary:
host: 192.168.1.2
port: 27017
database: database2
username: cheshi2
password: cheshi234567
3.引入pom包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- 项目改造的话,只需要新增此包,用于使注解@ConfigurationProperties可用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
4.代码
MultipleMongoProperties.java
@Component
@Data
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {
private MongoProperties primary = new MongoProperties();
private MongoProperties secondary = new MongoProperties();
}
MultipleMongoConfig.java
@Configuration
public class MultipleMongoConfig {
@Autowired
private MultipleMongoProperties mongoProperties;
@Primary
@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
public MongoTemplate primaryMongoTemplate() throws Exception {
return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
}
@Bean
@Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
public MongoTemplate secondaryMongoTemplate() throws Exception {
return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
}
@Bean
@Primary
public MongoDatabaseFactory primaryFactory(MongoProperties mongo) {
List<ServerAddress> serverAddressList = new ArrayList<>();
String[] hosts = mongo.getHost().split(",");
for(String host:hosts){
serverAddressList.add(new ServerAddress(host, Integer.valueOf(mongo.getPort())));
}
// 连接认证,如果设置了用户名和密码的话
MongoClientSettings settings = null;
ConnectionPoolSettings poolSetting=ConnectionPoolSettings.builder().
maxWaitTime(1500, TimeUnit.MILLISECONDS).build();
if(StringUtils.isNotBlank(mongo.getUsername())) {
MongoCredential credential = MongoCredential.createScramSha1Credential(mongo.getUsername(),
"admin", mongo.getPassword());
settings = MongoClientSettings.builder()
.credential(credential)
.applyToConnectionPoolSettings(builder->builder.applySettings(poolSetting))
.applyToClusterSettings(builder -> builder.hosts(serverAddressList)).build();
}else {
settings = MongoClientSettings.builder().applyToConnectionPoolSettings(builder->builder.applySettings(poolSetting))
.applyToClusterSettings(builder -> builder.hosts(serverAddressList)).build();
}
MongoClient mongoClient = MongoClients.create(settings);
// 创建MongoDbFactory
SimpleMongoClientDbFactory factory = new SimpleMongoClientDbFactory(mongoClient,
mongo.getDatabase());
return factory;
}
@Bean
public MongoDatabaseFactory secondaryFactory(MongoProperties mongo) {
List<ServerAddress> serverAddressList = new ArrayList<>();
String[] hosts = mongo.getHost().split(",");
for(String host:hosts){
serverAddressList.add(new ServerAddress(host, Integer.valueOf(mongo.getPort())));
}
// 连接认证,如果设置了用户名和密码的话
MongoClientSettings settings = null;
ConnectionPoolSettings poolSetting=ConnectionPoolSettings.builder().
maxWaitTime(1500, TimeUnit.MILLISECONDS).build();
if(StringUtils.isNotBlank(mongo.getUsername())) {
MongoCredential credential = MongoCredential.createScramSha1Credential(mongo.getUsername(),
"admin", mongo.getPassword());
settings = MongoClientSettings.builder()
.credential(credential)
.applyToConnectionPoolSettings(builder->builder.applySettings(poolSetting))
.applyToClusterSettings(builder -> builder.hosts(serverAddressList)).build();
}else {
settings = MongoClientSettings.builder().applyToConnectionPoolSettings(builder->builder.applySettings(poolSetting))
.applyToClusterSettings(builder -> builder.hosts(serverAddressList)).build();
}
MongoClient mongoClient = MongoClients.create(settings);
// 创建MongoDbFactory
SimpleMongoClientDbFactory factory = new SimpleMongoClientDbFactory(mongoClient,
mongo.getDatabase());
return factory;
}
}
4.调用
@Resource(name="primaryMongoTemplate")
private MongoTemplate primaryMongoTemplate;
@Resource(name="secondaryMongoTemplate")
private MongoTemplate secondaryMongoTemplate;
datas = (List<Class<?>>) this.primaryMongoTemplate.find(query, entityClass);
long count = this.secondaryMongoTemplate.count(query, entityClass);