wannix
wannix

Reputation: 149

Change default Mongo connection pool size in spring-boot

I want to change the default size of connection pool provided by java mongodb driver which is 100 according to mongo docs.

Below is the mongo client bean which I used to customize the connection pool size (refered this question). I set both min and max connectionPerHost attributes to 1 and ran 10 parallel worker threads which interact with the DB to make sure that my change is applied.

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

Then I calculated the starting and ending time spots of each worker thread. So that I know for sure the threads are working parallely and my connection pool size haven't changed by these configuration. Could anyone help me to get through this please? any help would be highly appreciated!

Upvotes: 10

Views: 42593

Answers (3)

Guruvansh Choudhary
Guruvansh Choudhary

Reputation: 76

With updated Spring boot(2.0.0 +) and Mongo DB java(3.9 +) driver versions following code can be used for creating configurable mongo template in spring boot.

Most of the configurations that were earlier part of MongoClientOptions are moved to 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();
    }
}

Above code is verified with dependencies -

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

Upvotes: 6

Namjith Aravind
Namjith Aravind

Reputation: 434

You can configure connection parameters by uri.

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

Please see the following documentation for other parameters.

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

Upvotes: 15

Oleksandr Yefymov
Oleksandr Yefymov

Reputation: 6509

You can configure connection pool size via MongoDb uri parameters. Details - https://stackoverflow.com/a/50407284/6629515

Upvotes: 0

Related Questions