有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mongodb Mongo+Java+SocketTimeOut

我正在使用MongoDb,在从数据库读取记录时遇到了问题。 我可以在游标中获取它们,但是当我尝试使用 光标。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) 个答案

  1. # 1 楼答案

    根据您所描述的内容,我认为我在PHP中遇到过这个问题,当时集合的读负载和写负载都很重。一些阅读可能会奏效,但最终它们会开始超时。我的游标超时设置为30秒,这不是问题,因为我们使用Mongo进行后端数据挖掘/处理。我们已经能够通过分片服务器在一定程度上缓解这个问题,但这个问题仍然经常出现。我认为这是因为Mongo的大部分都是单线程的,因此繁重的负载会变成一个长的处理队列,最终导致超时

    我还要检查并确保你的RAM没有被索引数据或实际数据填满——如果是这样的话,Mongo必须去硬盘获取数据,而这比从内存中读取数据要好得多。通过对相关数据库运行db.getStats(),您可以看到您的索引/数据足迹是什么