how to configure Mongo max thread?

纵然是瞬间 提交于 2019-12-24 03:09:33

问题


I have Mongo injected in to the spring. Everything works well. But when I try to persist data using too many threads , I have such errors:

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)

Where can I increase this setting?

I have only this config:

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

And My Log Service in Spring:

@Service
@Transactional
public class LogService {

    @Autowired  
    MongoOperations mongoOperations;  

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

回答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:


Looking at the xsd, under threads-allowed-to-block-for-connection-multiplier property, it states

The multiplier for connectionsPerHost for # of threads that can block. Default is 5. If connectionsPerHost is 10, and threadsAllowedToBlockForConnectionMultiplier is 5, then 50 threads can block more than that and an exception will be thrown.

So I'm thinking you could do something like

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



回答3:


add method how to put property name="connectionsPerHost" in java config

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


来源:https://stackoverflow.com/questions/26717726/how-to-configure-mongo-max-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!