MongoDB池超时

时间:2013-01-25 07:53:43

标签: java multithreading mongodb connection pool

我需要一些帮助来分析我在过去几周遇到的问题。

每次在这里,然后我的应用程序挂起。基本上它是基于postgres但是对于一些非常快速的交互,我们将关键数据传输到mongodb,并保持同步。这样做 - 它非常快,我们不会遇到阻止它同步的问题。

我们使用java 1.6和spring 3.2。我在大约15个业务逻辑类中实例化了一个Mongo-class和@Autowire。

现在我的问题是:大约2天后我得到例外:

com.mongodb.DBPortPool$ConnectionWaitTimeOut: Connection wait timeout after 120000 ms
    at com.mongodb.DBPortPool.get(DBPortPool.java:186)
    at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:327)
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:212)
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:189)
    at com.mongodb.DBApiLayer$Result._advance(DBApiLayer.java:452)
    at com.mongodb.DBApiLayer$Result.hasNext(DBApiLayer.java:418)
    at com.mongodb.DBCursor._hasNext(DBCursor.java:503)
    at com.mongodb.DBCursor.hasNext(DBCursor.java:523)

我想,游泳池已经没有连接了。

现在我的问题:

我是否总是要调用db.requestDone()?

根据这个页面:

http://www.mongodb.org/display/DOCS/Java+Driver+Concurrency - 第一段,我读到:

  

Mongo对象维护一个内部连接池   数据库(默认池大小为10)。对于DB的每个请求(查找,   插入等)java线程将从池中获取连接,   执行操作,并释放连接。

对我而言,这听起来就像线程关闭时传递的连接一样,这应该在请求完成后发生。 我们的应用程序访问mongodb时没有任何长生命线程。

感谢任何提示!

1 个答案:

答案 0 :(得分:2)

我们在阅读后未能关闭游标时遇到了这个问题。添加cursor.close()后 在我们所有的光标操作之后,问题就消失了