【问题标题】:how to configure Mongo max thread?如何配置Mongo最大线程?
【发布时间】:2014-11-03 15:46:25
【问题描述】:

我将 Mongo 注入到春天。 一切正常。但是当我尝试使用太多线程来持久化数据时,我遇到了这样的错误:

nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 50 has been exceeded.; nested exception is com.mongodb.MongoWaitQueueFullException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 50 has been exceeded.] with root cause
com.mongodb.MongoWaitQueueFullException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 50 has been exceeded.
    at com.mongodb.PooledConnectionProvider.get(PooledConnectionProvider.java:70)

我在哪里可以增加这个设置?

我只有这个配置:

<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
    <property name="host" value="X.X.X.X" />
    <property name="port" value="27017"></property>
</bean>

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongo" ref="mongo" />
    <constructor-arg name="databaseName" value="test" />
</bean>

还有我在 Spring 中的日志服务:

@Service
@Transactional
public class LogService {

    @Autowired  
    MongoOperations mongoOperations;  

    public void saveTransactionLog(Log l) {
        mongoOperations.save(l);
    }
}

【问题讨论】:

标签: spring-data-mongodb


【解决方案1】:
 <bean id="mongo" class="com.mongodb.Mongo">
      <constructor-arg name="addr" ref="address" />
      <constructor-arg name="options" ref="options" />
   </bean>

   <bean id="options" class="com.mongodb.MongoOptions">
      <property name="connectionsPerHost" value="${mongo.db.pool.size}"/>
      <property name="maxWaitTime" value="${mongo.db.pool.maxwait}"/>
   </bean>

   <bean id="address" class="com.mongodb.ServerAddress">
      <constructor-arg name="host" value="${mongo.db.host}" />
      <constructor-arg name="port" value="${mongo.db.port}" />
   </bean>

   <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
      <constructor-arg ref="mongo" />
      <constructor-arg name="databaseName" value="${mongo.db.name}" />
   </bean>

【讨论】:

    【解决方案2】:

    查看xsd,在threads-allowed-to-block-for-connection-multiplier 属性下,它声明

    可以阻塞的线程数的connectionsPerHost 乘数。默认为 5。如果 connectionsPerHost 为 10,threadsAllowedToBlockForConnectionMultiplier 为 5,则 50 个线程可以阻塞超过此值并抛出异常。

    所以我想你可以做类似的事情

    <property name="threads-allowed-to-block-for-connection-multiplier" value="xx" />
    

    【讨论】:

    • 引起:org.springframework.beans.NotWritablePropertyException: bean 类的无效属性'threads-allowed-to-block-for-connection-multiplier'
    【解决方案3】:

    添加方法如何将属性 name="connectionsPerHost" 放入 java config

    public Mongo mongo() throws Exception {
        return new MongoClient("127.0.0.1",MongoClientOptions.builder()
                                                             .connectionsPerHost(250)
                                                             .build());
    

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2021-02-11
      • 2015-03-19
      • 2012-06-19
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多