该实例已测试

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. 21天学通C++学习笔记(三):变量和常量

    1. 简述 内存是一种临时存储器,也被称为随机存取存储器(RAM),所有的计算机.智能手机及其他可编程设备都包含微处理器和一定数量的内存,用地址来定位不同的存储区域,像编号一样. 硬盘可以永久的存储数 ...

  2. asp.net mvc 请求处理流程,记录一下。

    asp.net mvc 请求处理流程,记录一下.

  3. virtueBox实现虚拟机的复制和粘贴

    1.在设备--共享粘贴板--勾选双向. 2.在设备--拖放--勾选双向. 3.在设备--安装增强功能,然后进入虚拟机安装增强功能即可.

  4. java 图书馆系统 练习

    话不多说 娱乐 ================================================== book 类(书本的基础属性) package 图书管理系统01; /** * @ ...

  5. 【转】C#中静态方法和非静态方法的区别

    源地址:https://www.cnblogs.com/amoshu/p/7477757.html 备注:静态方法不需要类的实例化就能调用,因为它是一直保存在内存中,不像非静态方法一样要放在实例化类时 ...

  6. 关于windows上 web 和 ftp 站点的创建及使用

    关于windows上 web 和 ftp 站点的创建及使用 引言 其实这是我网络基础课上的一次作业,觉得挺实用的,遂写成博客分享,也算是对这次作业的一次总结. 实验目的 通过此实验掌握WEB和FTP站 ...

  7. 开启和查看mysql的bin-log日志

    [root@VM_0_7_centos data]# vim /etc/my.cnf [root@VM_0_7_centos data]# vim /etc/my.cnf [root@VM_0_7_c ...

  8. 什么是redis?Reids的特点是什么?Redis支持的数据类型有哪些?

    首先,分布式缓存框架 可以 看成是nosql的一种 (1)什么是redis? redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的 ...

  9. Call requires API level 11 (current min is 8)报错

    新建一个Android Application Project,其中MainActivity.java中报错如下 Call requires API level 11(current min is 8 ...

  10. VMware下安装CentOS7 无法通过桥接模式进行联网

    #修改配置# vi /etc/sysconfig/network-scripts/ifcfg-ens33  (ifcfg-ens33,不同的机器名称不一样,但大都为ifcfg-ensxxx) 把文件中 ...