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 楼答案
根据您所描述的内容,我认为我在PHP中遇到过这个问题,当时集合的读负载和写负载都很重。一些阅读可能会奏效,但最终它们会开始超时。我的游标超时设置为30秒,这不是问题,因为我们使用Mongo进行后端数据挖掘/处理。我们已经能够通过分片服务器在一定程度上缓解这个问题,但这个问题仍然经常出现。我认为这是因为Mongo的大部分都是单线程的,因此繁重的负载会变成一个长的处理队列,最终导致超时
我还要检查并确保你的RAM没有被索引数据或实际数据填满——如果是这样的话,Mongo必须去硬盘获取数据,而这比从内存中读取数据要好得多。通过对相关数据库运行
db.getStats()
,您可以看到您的索引/数据足迹是什么