该实例已测试

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. svn: Can’t convert string from ‘UTF-8’ to native encoding: 解决办法

    主要原因是linux的编码发生改动 只需该为 en_US.UFT-8即可 [具体操作可以查看]https://www.cnblogs.com/sz-xioabai/p/10523423.html

  2. 日期 Date()

    1.Date 对象用于处理日期和时间.创建 Date 对象的语法:var myDate=new Date()Date 对象会自动把当前日期和时间保存为其初始值.2.参数形式有以下5种: new Dat ...

  3. servlet 核心技术

    servlet 核心技术 servlet 生命周期 在 servlet 生命周期中,servlet 容器完成加载 servlet 类和实例化一个 servlet 实例,并通过3个方法来完成生命周期中的 ...

  4. 关于jboss的线程问题+java.lang.outofmemoryError

    近日来,用Jmeter做压力测试.发现,每台客户机使用800个线程组压力倍增.昨天的测试,到了今天下午都没有跑完. 仔细观察了下Jboss的错误日志,发现,jboss已经宕机了. 本身后台的环境是使用 ...

  5. Unity---高度解耦和

    介绍 先举一个简单的例子: 在UGUI中新建一个Button和Text,要求实现点击Button改变Text中的文字. 我的第一反应就是在Button上添加一个脚本,获取点击事件来改变Text的内容. ...

  6. Deploy Flask app to Apache on Windows

    内容已过期,分割线以下为原文存档. 故事背景 这次我需要将一个Flask应用部署到本地的Windows服务器上.操作系统是64位的,程序是基于Python 3开发的,大体就是这样. 部署选项 根据Fl ...

  7. 10、C++函数

    1.定义函数和函数调用: 1.1.定义函数: 可以将函数分为两类,没有返回值的函数,和有返回值得函数,没有返回值得函数被称为void函数,其通用格式如下: void funtionname (para ...

  8. Qt 学习之路 2(28):坐标系统

    Qt 学习之路 2(28):坐标系统 豆子 2012年11月25日 Qt 学习之路 2 59条评论 在经历过实际操作,以及前面一节中我们见到的那个translate()函数之后,我们可以详细了解下 Q ...

  9. FPGA基础学习(4) -- 时序约束(理论篇)

    在FPGA 设计中,很少进行细致全面的时序约束和分析,Fmax是最常见也往往是一个设计唯一的约束.这一方面是由FPGA的特殊结构决定的,另一方面也是由于缺乏好用的工具造成的.好的时序约束可以指导布局布 ...

  10. 接口登录存在动态token

    Jmeter接口登录时获取到的参数token一直在变的问题,导致运行时总是报错 解决方法如下: 1.新建一个GET的HTTP请求 2.添加正则表达式提取器 记得name="_token&qu ...