【问题标题】:MongoDB Pool timeoutMongoDB 池超时
【发布时间】:2013-01-09 04:01:57
【问题描述】:

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

我的应用程序时不时地挂起。基本上它基于 postgres,但对于一些非常快速的交互,我们将关键数据传输到保持同步的 mongodb。这行得通 - 它的速度非常快,而且我们在保持同步方面没有任何问题。

我们使用 java 1.6 和 spring 3.2。我在大约 15 个业务逻辑类中实例化了一个 Mongo 类和 @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)。对于对数据库的每个请求(查找, 插入等)java线程将从池中获取连接, 执行操作,释放连接。

对我来说,这听起来就像每当线程关闭时连接就会被传回,这应该在请求完成后发生。 我们的应用程序中没有任何长期存在的线程访问 mongodb。

感谢任何提示!

一月

【问题讨论】:

    标签: java multithreading mongodb connection pool


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 2012-11-11
      • 1970-01-01
      • 2021-01-11
      • 2019-03-14
      • 1970-01-01
      • 2019-08-25
      • 2016-12-07
      相关资源
      最近更新 更多