springboot配置mongodb連接池的方法步驟
更新時間:2021年01月26日 10:19:54 作者:初窺門徑
這篇文章主要介紹了springboot配置mongodb連接池的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
application.yml 配置
mongodb: address: localhost:27017 database: soms username: admin password: 123456 # 連接池配置 clientName: soms-task # 客戶端的標識,用于定位請求來源等 connectionTimeoutMs: 10000 # TCP連接超時,毫秒 readTimeoutMs: 15000 # TCP讀取超時,毫秒 poolMaxWaitTimeMs: 3000 #當(dāng)連接池?zé)o可用連接時客戶端阻塞等待的時長,單位毫秒 connectionMaxIdleTimeMs: 60000 #TCP連接閑置時間,單位毫秒 connectionMaxLifeTimeMs: 120000 #TCP連接最多可以使用多久,單位毫秒 heartbeatFrequencyMs: 20000 #心跳檢測發(fā)送頻率,單位毫秒 minHeartbeatFrequencyMs: 8000 #最小的心跳檢測發(fā)送頻率,單位毫秒 heartbeatConnectionTimeoutMs: 10000 #心跳檢測TCP連接超時,單位毫秒 heartbeatReadTimeoutMs: 15000 #心跳檢測TCP連接讀取超時,單位毫秒 connectionsPerHost: 100 # 每個host的TCP連接數(shù) minConnectionsPerHost: 5 #每個host的最小TCP連接數(shù) #計算允許多少個線程阻塞等待可用TCP連接時的乘數(shù),算法: threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost,當(dāng)前配置允許10*20個線程阻塞 threadsAllowedToBlockForConnectionMultiplier: 10
用來獲取配置參數(shù)的類
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
@Data
@Validated
@Component
@ConfigurationProperties(prefix = "mongodb")
public class MongoClientOptionProperties {
/** 基礎(chǔ)連接參數(shù) */
private String database;
private String username;
private String password;
@NotNull
private List<String> address;
/** 客戶端連接池參數(shù) */
@NotNull
@Size(min = 1)
private String clientName;
/** socket連接超時時間 */
@Min(value = 1)
private int connectionTimeoutMs;
/** socket讀取超時時間 */
@Min(value = 1)
private int readTimeoutMs;
/** 連接池獲取鏈接等待時間 */
@Min(value = 1)
private int poolMaxWaitTimeMs;
/** 連接閑置時間 */
@Min(value = 1)
private int connectionMaxIdleTimeMs;
/** 連接最多可以使用多久 */
@Min(value = 1)
private int connectionMaxLifeTimeMs;
/** 心跳檢測發(fā)送頻率 */
@Min(value = 2000)
private int heartbeatFrequencyMs;
/** 最小的心跳檢測發(fā)送頻率 */
@Min(value = 300)
private int minHeartbeatFrequencyMs;
/** 計算允許多少個線程阻塞等待時的乘數(shù),算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost */
@Min(value = 1)
private int threadsAllowedToBlockForConnectionMultiplier;
/** 心跳檢測連接超時時間 */
@Min(value = 200)
private int heartbeatConnectionTimeoutMs;
/** 心跳檢測讀取超時時間 */
@Min(value = 200)
private int heartbeatReadTimeoutMs;
/** 每個host最大連接數(shù) */
@Min(value = 1)
private int connectionsPerHost;
/** 每個host的最小連接數(shù) */
@Min(value = 1)
private int minConnectionsPerHost;
}
配置類
package com.alkin.soms.common.mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
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 java.util.ArrayList;
import java.util.List;
@Configuration
public class MongoConfig {
private final Logger log = LoggerFactory.getLogger(MongoConfig.class);
/**
* 自定義mongo連接池 * * @param properties
* @return
*/
@Bean
@Autowired public MongoDbFactory mongoDbFactory(MongoClientOptionProperties properties) {
//創(chuàng)建客戶端參數(shù)
MongoClientOptions options = mongoClientOptions(properties);
//創(chuàng)建客戶端和Factory
List<ServerAddress> serverAddresses = new ArrayList<>();
for (String address : properties.getAddress()) {
String[] hostAndPort = address.split(":");
String host = hostAndPort[0];
int port = Integer.parseInt(hostAndPort[1]);
ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
}
String username = properties.getUsername();
String password = properties.getPassword();
String database = properties.getDatabase();
MongoClient mongoClient;
if (StringUtils.isNotEmpty(username) && StringUtils.isNotEmpty(password)) {
//創(chuàng)建認證客戶端
MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(
username,
database,
password.toCharArray());
mongoClient = new MongoClient(serverAddresses.get(0), mongoCredential, options);
} else {
//創(chuàng)建非認證客戶端
mongoClient = new MongoClient(serverAddresses, options);
}
SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, database);
log.info("mongodb注入成功");
return mongoDbFactory;
}
@Bean(name = "mongoTemplate")
@Autowired
public MongoTemplate getMongoTemplate(MongoDbFactory mongoDbFactory) {
return new MongoTemplate(mongoDbFactory);
}
/**
* mongo客戶端參數(shù)配置 * * @return
*/
public MongoClientOptions mongoClientOptions(MongoClientOptionProperties properties) {
return MongoClientOptions.builder()
.connectTimeout(properties.getConnectionTimeoutMs())
.socketTimeout(properties.getReadTimeoutMs()).applicationName(properties.getClientName())
.heartbeatConnectTimeout(properties.getHeartbeatConnectionTimeoutMs())
.heartbeatSocketTimeout(properties.getHeartbeatReadTimeoutMs())
.heartbeatFrequency(properties.getHeartbeatFrequencyMs())
.minHeartbeatFrequency(properties.getMinHeartbeatFrequencyMs())
.maxConnectionIdleTime(properties.getConnectionMaxIdleTimeMs())
.maxConnectionLifeTime(properties.getConnectionMaxLifeTimeMs())
.maxWaitTime(properties.getPoolMaxWaitTimeMs())
.connectionsPerHost(properties.getConnectionsPerHost())
.threadsAllowedToBlockForConnectionMultiplier(
properties.getThreadsAllowedToBlockForConnectionMultiplier())
.minConnectionsPerHost(properties.getMinConnectionsPerHost()).build();
}
@Bean
public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
try {
mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class));
} catch (NoSuchBeanDefinitionException ignore) {
}
// Don't save _class to dao
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
return mappingConverter;
}
}
到此這篇關(guān)于springboot配置mongodb連接池的方法步驟的文章就介紹到這了,更多相關(guān)springboot配置mongodb連接池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)
說到多態(tài),一定離不開其它兩大特性:封裝和繼承,下面這篇文章主要給大家介紹了關(guān)于新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-02-02
解決feign接口返回泛型設(shè)置屬性為null的問題
這篇文章主要介紹了解決feign接口返回泛型設(shè)置屬性為null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringCloud?Gateway讀取Request?Body方式
這篇文章主要介紹了SpringCloud?Gateway讀取Request?Body方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Mybatis-Plus動態(tài)表名的實現(xiàn)示例
面對復(fù)雜多變的業(yè)務(wù)需求,動態(tài)表名的處理變得愈發(fā)重要,本文主要介紹了Mybatis-Plus動態(tài)表名的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-07-07

