java - Mongo+Java+SocketTimeOut

标签 java mongodb mongo-java

我正在使用 MongoDb,但在从数据库中读取记录时遇到问题。 我能够将它们放在游标中但是当我尝试使用游标从游标中获取记录时 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)

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

请就此寻求帮助。

谢谢!

最佳答案

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

我还会检查并确保您的 RAM 没有被索引数据或实际数据填满 - 如果是这种情况,Mongo 必须转到硬盘驱动器以获取该数据,即 over 80x slower而不是从内存中读取。您可以通过为相关数据库运行 db.getStats() 来查看您的索引/数据足迹。

关于java - Mongo+Java+SocketTimeOut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472063/

相关文章:

java - $push 和 $set 在同一个 MongoDB 更新中

java - 使用特殊字符解析 XML

java - Java中float类型的转换和计算

java - EJB 和 CDI bean 序列化的最佳实践

python - 如何返回数组中的嵌套文档

javascript - MongoDB - 在一系列小时而不是日期之间查询

当辅助数据库关闭时,mongodb 无法删除数据库

java - 如何获取 Unicode 字符的代码?

mongodb - 是否有在 mongo 中运行的 Web 服务器?

java - 我可以使用 JNDI 共享 MongoClient 实例吗?