一、引入依赖

=================================================================

1.1 Maven


org.springframework.boot

spring-boot-starter-data-mongodb

1.2 Gradle


implementation ‘org.springframework.boot:spring-boot-starter-data-mongodb’

二、配置文件

=================================================================

spring.application.name=springboot-mongo

#基础连接参数

#要连接的数据库

mongodb.database=nobody

#用户名

mongodb.username=

#密码

mongodb.password=

#IP和端口(host:port),例如127.0.0.1:27017。集群模式用,分隔开,例如host1:port1,host2:port2

mongodb.address=127.0.0.1:27017

#设置认证数据库,如果有的话

mongodb.authenticationDatabase=

客户端连接池参数

#客户端的标识,用于定位请求来源等,一般用程序名

mongodb.clientName=${spring.application.name}

#TCP(socket)连接超时时间,毫秒

mongodb.connectionTimeoutMs=5000

#TCP(socket)连接闲置时间,毫秒

mongodb.maxConnectionIdleTimeMs=60000

#TCP(socket)连接最多可以使用多久,毫秒

mongodb.maxConnectionLifeTimeMs=300000

#TCP(socket)读取超时时间,毫秒

mongodb.readTimeoutMs=15000

#当连接池无可用连接时客户端阻塞等待的最大时长,毫秒

mongodb.maxWaitTimeMs=5000

#心跳检测发送频率,毫秒

mongodb.heartbeatFrequencyMs=20000

#最小的心跳检测发送频率,毫秒

mongodb.minHeartbeatFrequencyMs=8000

#心跳检测连接超时时间,毫秒

mongodb.heartbeatConnectionTimeoutMs=10000

#心跳检测读取超时时间,毫秒

mongodb.heartbeatReadTimeoutMs=15000

#线程池允许的最大连接数

mongodb.connectionsPerHost=100

#线程池空闲时保持的最小连接数

mongodb.minConnectionsPerHost=20

#计算允许多少个线程阻塞等待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*maxConnectionsPerHost

mongodb.threadsAllowedToBlockForConnectionMultiplier=10

三、MongoConfig配置类

===========================================================================

注意:项目中使用了lombok依赖,这样可以减少写getter、Setter等方法。

package com.nobody.mongo.config;

import com.mongodb.*;

import lombok.Getter;

import lombok.Setter;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

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.*;

import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

import org.springframework.util.StringUtils;

import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Min;

import javax.validation.constraints.NotEmpty;

import java.util.ArrayList;

import java.util.List;

/**

  • @Description mongo配置类

  • @Author Mr.nobody

  • @Date 2020/11/7

  • @Version 1.0

*/

@Configuration

// 将带有@ConfigurationProperties注解的类注入为Spring容器的Bean,

// 任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。

@EnableConfigurationProperties(MongoConfig.MongoClientOptionProperties.class)

public class MongoConfig {

/**

  • 此Bean也是可以不显示定义的,如果我们没有显示定义生成MongoTemplate实例,

  • SpringBoot利用我们配置好的MongoDbFactory在配置类中生成一个MongoTemplate,

  • 之后我们就可以在项目代码中直接@Autowired了。因为用于生成MongoTemplate

  • 的MongoDbFactory是我们自己在MongoConfig配置类中生成的,所以我们自定义的连接池参数也就生效了。

  • @param mongoDbFactory mongo工厂

  • @param converter 转换器

  • @return MongoTemplate实例

*/

@Bean

public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MappingMongoConverter converter) {

MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);

// 设置读从库优先

mongoTemplate.setReadPreference(ReadPreference.secondaryPreferred());

return mongoTemplate;

}

/**

  • 转换器

  • MappingMongoConverter可以自定义mongo转换器,主要自定义存取mongo数据时的一些操作,例如 mappingConverter.setTypeMapper(new

  • DefaultMongoTypeMapper(null)) 方法会将mongo数据中的_class字段去掉。

  • @param factory mongo工厂

  • @param context 上下文

  • @param conversions 自定义转换器

  • @return 转换器对象

*/

@Bean

public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context,

MongoCustomConversions conversions) {

DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);

MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);

mappingConverter.setCustomConversions(conversions);

// remove _class field

mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

return mappingConverter;

}

/**

  • 自定义mongo连接池

  • @param properties 属性配置类

  • @return MongoDbFactory对象

*/

@Bean

public MongoDbFactory mongoDbFactory(MongoClientOptionProperties properties) {

MongoClient mongoClient;

// 创建客户端参数

MongoClientOptions mongoClientOptions = mongoClientOptions(properties);

// 解析获取mongo服务地址

List serverAddressList = getServerAddress(properties.getAddress());

// 创建认证

MongoCredential mongoCredential = getCredential(properties);

// 创建客户端

if (null == mongoCredential) {

mongoClient = new MongoClient(serverAddressList, mongoClientOptions);

} else {

mongoClient = new MongoClient(serverAddressList, mongoCredential, mongoClientOptions);

}

return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());

}

/**

  • 创建认证

  • @param properties 属性配置类

  • @return 认证对象

*/

private MongoCredential getCredential(MongoClientOptionProperties properties) {

if (!StringUtils.isEmpty(properties.getUsername()) && !StringUtils.isEmpty(properties.getPassword())) {

// 没有专用认证数据库则取当前数据库

String database = StringUtils.isEmpty(properties.getAuthenticationDatabase()) ?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐