在Spring启动应用程序中配置mongodb属性maxWaitQueueSize?

时间:2016-02-15 15:06:16

标签: mongodb spring-boot

我在对我的应用程序进行压力测试时得到错误list

所以我想通过配置来配置[Error] no matching function for call to 'std::list<const AbstractButton*>::insert(std::list<const AbstractButton*>::const_iterator&, PushButton*)' 属性。

我正在使用spring boot来配置mongodb连接。我在我的应用程序中使用@EnableAutoConfiguration,并且我在application.properties文件中只声明了com.mongodb.MongoWaitQueueFullException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 500 has been exceeded.

如何使用spring boot配置maxWaitQueueSize属性?

如何确定spring.data.mongodb.uri=mongodb://user:password@ip:27017的好价值?

5 个答案:

答案 0 :(得分:3)

如果您使用的是MongoDB 3.0+,则可以在 mongouri 中设置waitQueueMultiple

spring.data.mongodb.uri=mongodb://user:password@ip:27017/?waitQueueMultiple=10

waitQueueMultiple是驱动程序将maxPoolSize值乘以的数字,以提供允许等待连接从池中获得的最大线程数。

  

如何为maxWaitQueueSize确定一个好的值?

它与MongoDB没有直接关系,但您可以在Hikari github wiki中阅读有关 Pool Sizing 的更多信息。

答案 1 :(得分:1)

您可以通过向MongoTemplate注入MongoOptions对象来实现此目的。

答案 2 :(得分:1)

在com.mongodb.MongoClientURI中,您可以找到可以在MongoClientOption中使用的参数。

        if (key.equals("maxpoolsize")) {
            builder.connectionsPerHost(Integer.parseInt(value));
        } else if (key.equals("minpoolsize")) {
            builder.minConnectionsPerHost(Integer.parseInt(value));
        } else if (key.equals("maxidletimems")) {
            builder.maxConnectionIdleTime(Integer.parseInt(value));
        } else if (key.equals("maxlifetimems")) {
            builder.maxConnectionLifeTime(Integer.parseInt(value));
        } else if (key.equals("waitqueuemultiple")) {
            builder.threadsAllowedToBlockForConnectionMultiplier(Integer.parseInt(value));
        } else if (key.equals("waitqueuetimeoutms")) {
            builder.maxWaitTime(Integer.parseInt(value));
        } else if (key.equals("connecttimeoutms")) {
            builder.connectTimeout(Integer.parseInt(value));
        } else if (key.equals("sockettimeoutms")) {
            builder.socketTimeout(Integer.parseInt(value));
        } else if (key.equals("autoconnectretry")) {
            builder.autoConnectRetry(_parseBoolean(value));
        } else if (key.equals("replicaset")) {
            builder.requiredReplicaSetName(value);
        } else if (key.equals("ssl")) {
            if (_parseBoolean(value)) {
                builder.socketFactory(SSLSocketFactory.getDefault());
            }
        }

答案 3 :(得分:0)

maxQueueSize限制是在Java客户端源代码中计算的: https://github.com/mongodb/mongo-java-driver/blob/3.10.x/driver-core/src/main/com/mongodb/connection/ConnectionPoolSettings.java#L273

它是maxConnectionPoolSizethreadsAllowedToBlockForConnectionMultiplier的乘积,因此可以通过连接URI中的?maxPoolSize=?waitQueueMultiple=进行修改。

答案 4 :(得分:0)

我正在使用Spring Boot Starter Webflux。此问题也会发生。 我试图添加MongoClientFactoryBean。没用 整个应用程序位于https://github.com/yigubigu/webfluxbenchmark中。我试图测试webflux和原始mvc的性能基准。

@Bean
    public MongoClientFactoryBean mongoClientFactoryBean() {
        MongoClientFactoryBean factoryBean = new MongoClientFactoryBean();
        factoryBean.setHost("localhost");
        factoryBean.setPort(27017);
        factoryBean.setSingleton(true);     
        MongoClientOptions options = MongoClientOptions.builder()
            .connectionsPerHost(1000)                                               
            .minConnectionsPerHost(500)
            .threadsAllowedToBlockForConnectionMultiplier(10)
            .build();
        factoryBean.setMongoClientOptions(options);
        return factoryBean;
    }