乐趣区

关于mongodb:springboot配置mongodb连接池

application.yml 配置

mongodb:
  address: localhost:27017
  database: soms
  username: admin
  password: 123456
  # 连接池配置
  clientName: soms-task # 客户端的标识,用于定位申请起源等
  connectionTimeoutMs: 10000     # TCP 连贯超时,毫秒
  readTimeoutMs: 15000       # TCP 读取超时,毫秒
  poolMaxWaitTimeMs: 3000        #当连接池无可用连贯时客户端阻塞期待的时长,单位毫秒
  connectionMaxIdleTimeMs: 60000   #TCP 连贯闲置工夫,单位毫秒
  connectionMaxLifeTimeMs: 120000    #TCP 连贯最多能够应用多久,单位毫秒
  heartbeatFrequencyMs: 20000      #心跳检测发送频率,单位毫秒
  minHeartbeatFrequencyMs: 8000    #最小的心跳检测发送频率,单位毫秒
  heartbeatConnectionTimeoutMs: 10000  #心跳检测 TCP 连贯超时,单位毫秒
  heartbeatReadTimeoutMs: 15000    #心跳检测 TCP 连贯读取超时,单位毫秒
  connectionsPerHost: 100       # 每个 host 的 TCP 连接数
  minConnectionsPerHost: 5     #每个 host 的最小 TCP 连接数
 #计算容许多少个线程阻塞期待可用 TCP 连贯时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost,以后配置容许 10*20 个线程阻塞   
  threadsAllowedToBlockForConnectionMultiplier: 10

用来获取配置参数的类

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 {
    /** 根底连贯参数 */
 private String database;
 private String username;
 private String password;
 @NotNull
 private List<String> address;
 /** 客户端连接池参数 */
 @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;
 /** 心跳检测发送频率 */
 @Min(value = 2000)
    private int heartbeatFrequencyMs;
 /** 最小的心跳检测发送频率 */
 @Min(value = 300)
    private int minHeartbeatFrequencyMs;
 /** 计算容许多少个线程阻塞期待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost */
 @Min(value = 1)
    private int threadsAllowedToBlockForConnectionMultiplier;
 /** 心跳检测连贯超时工夫 */
 @Min(value = 200)
    private int heartbeatConnectionTimeoutMs;
 /** 心跳检测读取超时工夫 */
 @Min(value = 200)
    private int heartbeatReadTimeoutMs;
 /** 每个 host 最大连接数 */
 @Min(value = 1)
    private int connectionsPerHost;
 /** 每个 host 的最小连接数 */
 @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) {
        // 创立客户端参数
 MongoClientOptions options = mongoClientOptions(properties);
 // 创立客户端和 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)) {
            // 创立认证客户端
 MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(
                    username,
 database,
 password.toCharArray());
 mongoClient = new MongoClient(serverAddresses.get(0), mongoCredential, options);
 } else {
            // 创立非认证客户端
 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 客户端参数配置 * * @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;
 }
}
退出移动版