欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot中使用MongoDB的连接池配置的方法

程序员文章站 2022-03-10 10:51:37
因为今天开发遇到了性能问题,可能与mongodb的连接有关,所以稍稍深入看了一下,正好搜到原来有人写过这篇相关的内容,所以转载过来。回头有时间可以写个扩展到springfo...

因为今天开发遇到了性能问题,可能与mongodb的连接有关,所以稍稍深入看了一下,正好搜到原来有人写过这篇相关的内容,所以转载过来。回头有时间可以写个扩展到springforall里,主体思路还是一样的。感谢这位美女程序媛的文章!

说明

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 时,增加修改自己需要的配置参数。

至此,就完成了全部配置,运行测试即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。