蒙戈+ Java的+了socketTimeout

时间:2011-03-29 11:53:56

标签: java mongodb mongo-java

我正在使用MongoDb,我在从DB读取记录时遇到问题。 我能够在游标中获取它们,但是当我尝试从游标中获取记录时 cursor.hasNext()它给了我以下异常:

com.mongodb.MongoInternalException: couldn't get next element
        at com.mongodb.DBCursor.hasNext(DBCursor.java:459)
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:146)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
        at org.bson.io.Bits.readFully(Bits.java:35)
        at org.bson.io.Bits.readFully(Bits.java:28)
        at com.mongodb.Response.<init>(Response.java:35)
        at com.mongodb.DBPort.go(DBPort.java:101)
        at com.mongodb.DBPort.go(DBPort.java:66)
        at com.mongodb.DBPort.call(DBPort.java:56)
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211)
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:220)
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:220)
        at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:266)
        at com.mongodb.DBCursor._check(DBCursor.java:309)
        at com.mongodb.DBCursor._hasNext(DBCursor.java:431)
        at com.mongodb.DBCursor.hasNext(DBCursor.java:456)

也许我正面临这个问题,因为我的数据不断增加,因此我在游标中获得了更多的记录。我访问的数据库也在远程机器上。

请提供帮助。

谢谢!

1 个答案:

答案 0 :(得分:4)

根据您所描述的内容,我认为当集合遇到大量读取负载和写入负载时,我在PHP中遇到过这个问题。有些读取可能有效,但最终它们会开始计时。我的光标超时设置为30秒,这不是问题,因为我们使用Mongo进行后端数据挖掘/处理。我们已经能够通过分割我们的服务器来缓解这个问题,但问题仍然会定期出现。我认为这源于这样一个事实,即大多数Mongo都是单线程的,因此重负载会变成一个长处理队列,最终会变成超时。

我还会检查并确保您的RAM没有被索引数据或实际数据填满 - 如果是这种情况,Mongo必须转到硬盘才能获取该数据,那就是{{3}而不是从记忆中读取。您可以通过为相关数据库运行db.getStats()来查看索引/数据占用量。