zoukankan      html  css  js  c++  java
  • Spring Boot配置MongoDB连接池

    Spring Boot中通过依赖 spring-boot-starter-data-mongodb ,来实现 spring-data-mongodb 的自动配置。

    但是默认情况下,Spring Boot 中,并没有像使用MySQL或者Redis一样,提供了连接池配置的功能。因此,我们需要自行重写 MongoDbFactory ,实现MongoDB客户端连接的参数配置扩展。

    需要说明的是,MongoDB的客户端本身就是一个连接池,因此,我们只需要配置客户端即可。

    配置文件

    为了统一Spring Boot的配置,我们要将重写的配置也配置到 application.yml 中,前缀为 spring.data.mongodb.custom 下(前缀可自己随意配置):

    spring:
     data:
     mongodb:
      custom:
      hosts:
       - 10.0.5.1
       - 10.0.5.1
      ports:
       - 27017
       - 27018
      replica-set: mgset-3590061
      username: jancee
      password: abc123
      database: jancee
      authentication-database: admin
      connections-per-host: 20
      min-connections-per-host: 20

    该配置例子中,配置了副本集,其中包含了主机 10.0.5.1:27017 和 10.0.5.1:27018 ,其它配置与Spring Boot的标准配置类似,另外, connections-per-host 为客户端的连接数, in-connections-per-host 为客户端最小连接数。

    将配置包装成类

    为方便调用和可读性,将上述配置包装成一个配置实体类, MongoConfig.java 代码如下:

    package com.feidiao.jancee.fdiot.api.config.mongo;
    import org.hibernate.validator.constraints.NotBlank;
    import org.hibernate.validator.constraints.NotEmpty;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.annotation.Validated;
    import java.util.List;
     
    @Component
    @Validated
    public class MongoSettingsProperties {
     
     @NotBlank
     private String database;
     
     @NotEmpty
     private List<String> hosts;
     
     @NotEmpty
     private List<Integer> ports;
     private String replicaSet;
     private String username;
     private String password;
     private String authenticationDatabase;
     private Integer minConnectionsPerHost = 10;
     private Integer connectionsPerHost = 2;
     public MongoSettingsProperties() {
     
     }
     
     public String getDatabase() {
      return database;
     }
     
     public void setDatabase(String database) {
      this.database = database;
     }
     
     public List<String> getHosts() {
      return hosts;
     }
     
     public void setHosts(List<String> hosts) {
      this.hosts = hosts;
     }
     
     public List<Integer> getPorts() {
      return ports;
     }
     
     public void setPorts(List<Integer> ports) {
      this.ports = ports;
     }
     
     public String getReplicaSet() {
      return replicaSet;
     }
     
     public void setReplicaSet(String replicaSet) {
      this.replicaSet = replicaSet;
     }
     
     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 Integer getMinConnectionsPerHost() {
      return minConnectionsPerHost;
     }
     
     public void setMinConnectionsPerHost(Integer minConnectionsPerHost) {
      this.minConnectionsPerHost = minConnectionsPerHost;
     }
     
     public Integer getConnectionsPerHost() {
      return connectionsPerHost;
     }
     
     public void setConnectionsPerHost(Integer connectionsPerHost)  {
      this.connectionsPerHost = connectionsPerHost;
     }
    }

    覆盖MongoDbFactory

    接下来,就是覆盖Spring Boot原有的 MongoDbFactory Bean,新建文件 MongoConfig.java ,代码如下:

    import com.mongodb.MongoClient;
    import com.mongodb.MongoClientOptions;
    import com.mongodb.MongoCredential;
    import com.mongodb.ServerAddress;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.MongoDbFactory;
    import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
    import java.util.ArrayList;
    import java.util.List;
     
    @Configuration
    public class MongoConfig {
     // 注入配置实体
     @Autowired
     private MongoSettingsProperties mongoSettingsProperties;
     @Bean
     @ConfigurationProperties(
       prefix = "spring.data.mongodb.custom")
     MongoSettingsProperties mongoSettingsProperties() {
      return new MongoSettingsProperties();
     }
     
     // 覆盖默认的MongoDbFactory
     @Bean
     MongoDbFactory mongoDbFactory() {
      //客户端配置(连接数、副本集群验证)
      MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
      builder.connectionsPerHost(mongoSettingsProperties.getConnectionsPerHost());
      builder.minConnectionsPerHost(mongoSettingsProperties.getMinConnectionsPerHost());
      if (mongoSettingsProperties.getReplicaSet() != null) {
       builder.requiredReplicaSetName(mongoSettingsProperties.getReplicaSet());
      }
      MongoClientOptions mongoClientOptions = builder.build();
     
      // MongoDB地址列表
      List<ServerAddress> serverAddresses = new ArrayList<>();
      for (String host : mongoSettingsProperties.getHosts()) {
       Integer index = mongoSettingsProperties.getHosts().indexOf(host);
       Integer port = mongoSettingsProperties.getPorts().get(index);
     
       ServerAddress serverAddress = new ServerAddress(host, port);
       serverAddresses.add(serverAddress);
      }
      System.out.println("serverAddresses:" + serverAddresses.toString());
     
      // 连接认证
      List<MongoCredential> mongoCredentialList = new ArrayList<>();
      if (mongoSettingsProperties.getUsername() != null) {
       mongoCredentialList.add(MongoCredential.createScramSha1Credential(
         mongoSettingsProperties.getUsername(),
         mongoSettingsProperties.getAuthenticationDatabase() != null ? mongoSettingsProperties.getAuthenticationDatabase() : mongoSettingsProperties.getDatabase(),
         mongoSettingsProperties.getPassword().toCharArray()));
      }
      System.out.println("mongoCredentialList:" + mongoCredentialList.toString());
      //创建客户端和Factory
      MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredentialList, mongoClientOptions);
      MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, mongoSettingsProperties.getDatabase());
      return mongoDbFactory;
     }
    }

    在这里,实现了MongoDB连接时,前面配置的参数的设置,按照自己的实际情况,可以在 new SimpleMongoDbFactory 时,增加修改自己需要的配置参数。

    至此,就完成了全部配置。

    转载来源:http://blog.didispace.com/spring-boot-mongodb-connection-pool/

  • 相关阅读:
    tensorflow2.0 GPU和CPU 时间对比
    第一次使用FileZilla Server
    PremiumSoft Navicat 15 for Oracle中文破解版安装教程
    Unmapped Spring configuration files found. Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.
    ng : 无法加载文件 D: odejs ode_global g.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
    angular
    Github上优秀的go项目
    win10---file explore 中remove quick access folder
    react--useEffect使用
    linux---cat 和 grep 的妙用
  • 原文地址:https://www.cnblogs.com/taich-flute/p/11755254.html
Copyright © 2011-2022 走看看