在 spring-boot 中更改默认的 Mongo 连接池大小

wan*_*nix 5 java spring mongodb mongo-java-driver

我想更改 java mongodb 驱动程序提供的连接池的默认大小,根据 mongo docs 为 100。

下面是我用来自定义连接池大小的 mongo 客户端 bean(参考这个问题)。我将 min 和 max connectionPerHost 属性都设置为 1 并运行 10 个与数据库交互的并行工作线程,以确保应用我的更改。

@Bean
public Mongo mongo() throws Exception {
    MongoClientOptions.Builder clientOptions = new MongoClientOptions.Builder();
    clientOptions.minConnectionsPerHost(1);
    clientOptions.connectionsPerHost(1);
    MongoClient mongoClient = new MongoClient(new MongoClientURI(env.getProperty("mongodbhost"), clientOptions));
    return mongoClient;
}
Run Code Online (Sandbox Code Playgroud)

然后我计算了每个工作线程的开始和结束时间点。这样我就可以确定线程正在并行工作,并且这些配置没有改变我的连接池大小。有人可以帮我解决这个问题吗?任何帮助将不胜感激!

Nam*_*ind 14

您可以通过uri配置连接参数。

spring.data.mongodb.uri=mongodb://localhost:27017/?connectTimeoutMS=300000&minPoolSize=0&maxPoolSize=10&maxIdleTimeMS=900000

其他参数请参见以下文档。

https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options


小智 5

随着更新的 Spring boot(2.0.0 +) 和 Mongo DB java(3.9 +) 驱动程序版本,以下代码可用于在 Spring Boot 中创建可配置的 mongo 模板。

MongoClientOptions 早期部分的大部分配置都已移至 MongoClientSettings。

import com.mongodb.*;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;

import com.mongodb.connection.*;
import org.springframework.data.mongodb.core.MongoTemplate;

@Configuration
public class MongoConfig {

    //-- variables 

    @Bean(name = "mongoTemplate")
    public MongoTemplate getMongoTemplate(){
        MongoTemplate mongoTemplate = new MongoTemplate(getMongoClient(), mongoDatabaseName);
        return mongoTemplate;
    }

    private MongoClient getMongoClient(){
        List<ServerAddress> serverAddressList = new ArrayList<>();
        String[] hostPortList = mongoHostPortList.split(",");
        for (String serverAddress : hostPortList) {
            String[] hostPortArr = serverAddress.split(":");
            serverAddressList.add(new ServerAddress(hostPortArr[0], Integer.parseInt(hostPortArr[1])));
        }

        MongoClientSettings mongoSettingsProperties = getMongoClientSettings();
        MongoClient mongoClient = MongoClients.create(mongoSettingsProperties);
        return mongoClient;
    }

    private MongoClientSettings getMongoClientSettings() {
        return MongoClientSettings.builder()
                .applicationName(appName)
                .applyToSslSettings(sslBuilder ->
                        SslSettings.builder().
                                enabled(sslEnabled).
                                invalidHostNameAllowed(false).build())
                .applyToConnectionPoolSettings(connPoolBuilder ->
                        ConnectionPoolSettings.builder().
                                maxWaitTime(maxWaitTime, MILLISECONDS).
                                maxSize(connectionPoolMinSize).
                                maxSize(connectionPoolMaxSize).build())
                .applyToSocketSettings(socketBuilder ->
                        SocketSettings.builder().
                                connectTimeout(connectionTimeout,MILLISECONDS).build())
                .readPreference(ReadPreference.secondaryPreferred())
                .build();
    }
}

Run Code Online (Sandbox Code Playgroud)

上面的代码通过依赖项进行了验证 -

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.11.2</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)