我需要一些帮助来分析我在过去几周遇到的问题。
时不时地我的应用程序挂起。基本上它基于 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。
感谢您的任何提示!
简