【问题标题】:Configure mongodb property maxWaitQueueSize in Spring boot application?在 Spring Boot 应用程序中配置 mongodb 属性 maxWaitQueueSize?
【发布时间】:2016-05-26 13:25:57
【问题描述】:

我在对我的应用程序进行压力测试时收到错误 com.mongodb.MongoWaitQueueFullException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 500 has been exceeded.

所以我正在考虑通过配置来配置maxWaitQueueSize 属性。

我正在使用 spring boot 来配置 mongodb 连接。我在我的应用程序中使用@EnableAutoConfiguration,并且我在 application.properties 文件中只声明了spring.data.mongodb.uri=mongodb://user:password@ip:27017

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

我如何确定maxWaitQueueSize 的价值?

【问题讨论】:

    标签: mongodb spring-boot


    【解决方案1】:

    如果您使用的是 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 的信息。

    【讨论】:

    • 我可以为 maxPoolSize 设置什么?我在 MongoClientOptions.java 中看到默认设置为 100
    • 它有一个默认值,但您可以根据应用程序要求覆盖它。
    【解决方案2】:

    在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】:

      我正在使用 Spring Boot 启动器 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;
          }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          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=进行修改。

          【讨论】:

            猜你喜欢
            • 2022-09-25
            • 2019-01-02
            • 2019-10-16
            • 2015-09-21
            • 2015-11-21
            • 2019-03-18
            • 2018-03-23
            • 1970-01-01
            • 2016-08-24
            相关资源
            最近更新 更多