该实例已测试

POM.XML

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

application.yml

  data:
mongodb:
primary:
uri: 192.168.0.103:27870
database:
username:
password:
authentication-database:
second:
uri: 192.168.0.103:27870
database:
username:
password:
authentication-database:
connectionsPerHost: 10
options:
min-connections-per-host: 8
threads-allowed-to-block-for-connection-multiplier: 4
max-wait-time: 1500
socket-timeout: 1500

AbstractMongoConfig

 package com.haoyun.common.config.mongo;

 import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory; import java.util.ArrayList;
import java.util.List; public class AbstractMongoConfig { protected List<String> uri;
protected String username;
protected String password;
protected String authenticationDatabase;
protected String database; @Value("${spring.data.mongodb.connectionsPerHost}")
private Integer connectionsPerHost; @Value("${spring.data.mongodb.options.min-connections-per-host}")
private Integer minConnectionsPerHost; @Value("${spring.data.mongodb.options.threads-allowed-to-block-for-connection-multiplier}")
private Integer threadsAllowedToBlockForConnectionMultiplier; @Value("${spring.data.mongodb.options.max-wait-time}")
private Integer maxWaitTime; @Value("${spring.data.mongodb.options.socket-timeout}")
private Integer socketTimeout; //覆盖默认的MongoDbFacotry
public MongoDbFactory mongoDbFactory() {
//客户端配置(连接数、副本集群验证)
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectionsPerHost(this.connectionsPerHost);
builder.minConnectionsPerHost(this.minConnectionsPerHost);
builder.threadsAllowedToBlockForConnectionMultiplier(this.threadsAllowedToBlockForConnectionMultiplier);
builder.maxWaitTime(this.maxWaitTime);
builder.socketTimeout(this.socketTimeout); MongoClientOptions mongoClientOptions = builder.build(); List<ServerAddress> serverAddresses = new ArrayList<>();
List<String> address = this.uri;
for (String add : address) {
String[] str = add.split(":");
ServerAddress serverAddress = new ServerAddress(str[0], Integer.parseInt(str[1]));
serverAddresses.add(serverAddress);
} // 连接认证
List<MongoCredential> mongoCredentialList = new ArrayList<>();
if (this.username != null) {
mongoCredentialList.add(MongoCredential.createScramSha1Credential(
this.username,
this.authenticationDatabase != null ? this.authenticationDatabase : this.database,
this.password.toCharArray()));
}
System.out.println("mongoCredentialList:" + mongoCredentialList.toString()); //创建客户端和Factory
MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredentialList, mongoClientOptions);
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, this.database); return mongoDbFactory;
} public List<String> getUri() {
return uri;
} public void setUri(List<String> uri) {
this.uri = uri;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getAuthenticationDatabase() {
return authenticationDatabase;
} public void setAuthenticationDatabase(String authenticationDatabase) {
this.authenticationDatabase = authenticationDatabase;
} public String getDatabase() {
return database;
} public void setDatabase(String database) {
this.database = database;
}
}

PrimaryMongoConfig

 package com.haoyun.common.config.mongo;

 import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate; /**
* @author milicool
* Created on 2018/11/26
*/
@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.primary")
public class PrimaryMongoConfig extends AbstractMongoConfig { @Primary
@Bean(name = "mongoTemplate")
public MongoTemplate getMongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
}

SecondMongoConfig

 package com.haoyun.common.config.mongo;

 import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate; /**
* @author milicool
* Created on 2018/11/26
*/
@Configuration
@ConfigurationProperties(prefix="spring.data.mongodb.second")
public class SecondMongoConfig extends AbstractMongoConfig { @Bean(name = "secondMmongoTemplate")
public MongoTemplate getMongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
}

MongoDao

 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("mongoDao")
public class MongoDao { @Resource(name = "mongoTemplate")
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();
} }

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, 所有的都公用一个行不行?(待优化)

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

springboot整合mongo多数据源的更多相关文章

  1. SpringBoot整合阿里Druid数据源及Spring-Data-Jpa

    SpringBoot整合阿里Druid数据源及Spring-Data-Jpa https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=224 ...

  2. SpringBoot整合Mybatis多数据源 (AOP+注解)

    SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...

  3. 三、SpringBoot 整合mybatis 多数据源以及分库分表

    前言 说实话,这章本来不打算讲的,因为配置多数据源的网上有很多类似的教程.但是最近因为项目要用到分库分表,所以让我研究一下看怎么实现.我想着上一篇博客讲了多环境的配置,不同的环境调用不同的数据库,那接 ...

  4. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.

    用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER ...

  5. SpringBoot整合mybatis多数据源,支持分布式事务

    编码工具:IDEA SpringBoot版本:2.0.1 JDK版本:1.8 1.使用IDEA构建一个Maven工程 ,添加依赖: <?xml version="1.0" e ...

  6. spring-boot整合Mybatis多数据源案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  7. spring-boot整合mybaits多数据源动态切换案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  8. spring-boot整合mongodb多数据源的案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  9. 【java框架】SpringBoot(7) -- SpringBoot整合MyBatis

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也 ...

随机推荐

  1. owinAuthorize

    Nuget包获取 Install-Package Microsoft.AspNet.WebApi.Owin -Version 5.1.2 Install-Package Microsoft.Owin. ...

  2. IO模型《一》IO模型介绍

    IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞 ...

  3. [转]Resolving Python error: Unable to find vcvarsall.bat

    Resolving Python error: Unable to find vcvarsall.bat While installing python package flask-user usin ...

  4. FireFox调试代码技巧

    本文版权归 csdn DyncRole 所有,此处为技术收藏,如有再转请标明原创作者及出处,以示尊重! 作者:DyncRole 原文:http://blog.csdn.net/qqhjqs/artic ...

  5. Python3用sys和time模块实现进度条

    import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rat ...

  6. /bin/bash: sshpass: command not found

    按照如下命令进行安装即可: apt-get install sshpass

  7. ELK (Elasticsearch , Logstash, Kibana [+FileBeat])

    ELK 简述: ELK 是: Elasticsearch , Logstash, Kibana 简称, 它们都是开源软件. Elasticsearch[搜索]是个开源分布式基于Lucene的搜索引擎, ...

  8. 16. js 判断变量类型,包括ES6 新类型Symbol

    相信大家在开发中遇到需要判断变量类型的问题,js变量按存储类型可分为值类型和引用类型,值类型包括Undefined.String.Number.Boolean,引用类型包括object.Array.F ...

  9. Linux系统下Qt环境搭建

    http://www.linuxidc.com/Linux/2013-07/87576.htm 主要是需要提前安装一些动态库,否则编译的时候会出现 /usr/bin/ld: cannot find - ...

  10. POJ_2492 A Bug's Life 【并查集】

    一.题面 POJ2492 二.分析 并查集判断类别的题目感觉套路都差不多. 还是先判断在不在一个集合里,在一个集合里才能判断是否同类. 若不在一个集合里则需要将这两个点联系起来. 关于联系起来后关系的 ...