Spring Boot中使用MongoDB的连接池配置的方法
因为今天开发遇到了性能问题,可能与MongoDB的连接有关,所以稍稍深入看了一下,正好搜到原来有人写过这篇相关的内容,所以转载过来。回头有时间可以写个扩展到SpringForAll里,主体思路还是一样的。感谢这位美女程序媛的文章!
说明
SpringBoot中通过依赖spring-boot-starter-data-mongodb,来实现spring-data-mongodb的自动配置。
但是默认情况下,SpringBoot中,并没有像使用MySQL或者Redis一样,提供了连接池配置的功能。因此,我们需要自行重写MongoDbFactory,实现MongoDB客户端连接的参数配置扩展。
需要说明的是,MongoDB的客户端本身就是一个连接池,因此,我们只需要配置客户端即可。
配置文件
为了统一SpringBoot的配置,我们要将重写的配置也配置到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,其它配置与SpringBoot的标准配置类似,另外,connections-per-host为客户端的连接数,in-connections-per-host为客户端最小连接数。
将配置包装成类
为方便调用和可读性,将上述配置包装成一个配置实体类,MongoConfig.java代码如下:
packagecom.feidiao.jancee.fdiot.api.config.mongo;
importorg.hibernate.validator.constraints.NotBlank;
importorg.hibernate.validator.constraints.NotEmpty;
importorg.springframework.stereotype.Component;
importorg.springframework.validation.annotation.Validated;
importjava.util.List;
@Component
@Validated
publicclassMongoSettingsProperties{
@NotBlank
privateStringdatabase;
@NotEmpty
privateListhosts;
@NotEmpty
privateListports;
privateStringreplicaSet;
privateStringusername;
privateStringpassword;
privateStringauthenticationDatabase;
privateIntegerminConnectionsPerHost=10;
privateIntegerconnectionsPerHost=2;
publicMongoSettingsProperties(){
}
publicStringgetDatabase(){
returndatabase;
}
publicvoidsetDatabase(Stringdatabase){
this.database=database;
}
publicListgetHosts(){
returnhosts;
}
publicvoidsetHosts(Listhosts){
this.hosts=hosts;
}
publicListgetPorts(){
returnports;
}
publicvoidsetPorts(Listports){
this.ports=ports;
}
publicStringgetReplicaSet(){
returnreplicaSet;
}
publicvoidsetReplicaSet(StringreplicaSet){
this.replicaSet=replicaSet;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringgetAuthenticationDatabase(){
returnauthenticationDatabase;
}
publicvoidsetAuthenticationDatabase(StringauthenticationDatabase){
this.authenticationDatabase=authenticationDatabase;
}
publicIntegergetMinConnectionsPerHost(){
returnminConnectionsPerHost;
}
publicvoidsetMinConnectionsPerHost(IntegerminConnectionsPerHost){
this.minConnectionsPerHost=minConnectionsPerHost;
}
publicIntegergetConnectionsPerHost(){
returnconnectionsPerHost;
}
publicvoidsetConnectionsPerHost(IntegerconnectionsPerHost){
this.connectionsPerHost=connectionsPerHost;
}
}
覆盖MongoDbFactory
接下来,就是覆盖SpringBoot原有的MongoDbFactoryBean,新建文件MongoConfig.java,代码如下:
importcom.mongodb.MongoClient;
importcom.mongodb.MongoClientOptions;
importcom.mongodb.MongoCredential;
importcom.mongodb.ServerAddress;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.data.mongodb.MongoDbFactory;
importorg.springframework.data.mongodb.core.SimpleMongoDbFactory;
importjava.util.ArrayList;
importjava.util.List;
@Configuration
publicclassMongoConfig{
//注入配置实体
@Autowired
privateMongoSettingsPropertiesmongoSettingsProperties;
@Bean
@ConfigurationProperties(
prefix="spring.data.mongodb.custom")
MongoSettingsPropertiesmongoSettingsProperties(){
returnnewMongoSettingsProperties();
}
//覆盖默认的MongoDbFactory
@Bean
MongoDbFactorymongoDbFactory(){
//客户端配置(连接数、副本集群验证)
MongoClientOptions.Builderbuilder=newMongoClientOptions.Builder();
builder.connectionsPerHost(mongoSettingsProperties.getConnectionsPerHost());
builder.minConnectionsPerHost(mongoSettingsProperties.getMinConnectionsPerHost());
if(mongoSettingsProperties.getReplicaSet()!=null){
builder.requiredReplicaSetName(mongoSettingsProperties.getReplicaSet());
}
MongoClientOptionsmongoClientOptions=builder.build();
//MongoDB地址列表
ListserverAddresses=newArrayList<>();
for(Stringhost:mongoSettingsProperties.getHosts()){
Integerindex=mongoSettingsProperties.getHosts().indexOf(host);
Integerport=mongoSettingsProperties.getPorts().get(index);
ServerAddressserverAddress=newServerAddress(host,port);
serverAddresses.add(serverAddress);
}
System.out.println("serverAddresses:"+serverAddresses.toString());
//连接认证
ListmongoCredentialList=newArrayList<>();
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
MongoClientmongoClient=newMongoClient(serverAddresses,mongoCredentialList,mongoClientOptions);
MongoDbFactorymongoDbFactory=newSimpleMongoDbFactory(mongoClient,mongoSettingsProperties.getDatabase());
returnmongoDbFactory;
}
}
在这里,实现了MongoDB连接时,前面配置的参数的设置,按照自己的实际情况,可以在newSimpleMongoDbFactory时,增加修改自己需要的配置参数。
至此,就完成了全部配置,运行测试即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。