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

时间:2017-11-07 15:02:43

标签: java spring mongodb mongo-java-driver

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

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

@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;
}

然后我计算了每个工作线程的起始和结束时间点。所以我确定线程并行工作,并且我的连接池大小没有被这些配置改变。 有人可以帮我解决这个问题吗?任何帮助都将受到高度赞赏!

3 个答案:

答案 0 :(得分:1)

您可以通过MongoDb uri参数配置连接池大小。详情 - https://stackoverflow.com/a/50407284/6629515

答案 1 :(得分:1)

您可以通过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

答案 2 :(得分:0)

使用更新的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();
    }
}

以上代码已通过依赖性验证-

    <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>