【问题标题】:Mongo+Java+SocketTimeOutMongo+Java+SocketTimeOut
【发布时间】:2011-03-29 11:53:55
【问题描述】:

我正在使用 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)

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

请在这方面需要帮助。

谢谢!

【问题讨论】:

  • 您可以检索任何记录吗?您是否有可能导致此问题的防火墙规则?您是否计算过超时时间?
  • 您可以粘贴您正在使用的生成此错误的代码吗?它与标准教程相比如何?您是在此错误发生之前获取一些文档,还是在您取回第一个文档之前获取这些文档?
  • 你能确定你和你的服务器之间没有防火墙或类似的东西吗?这看起来像是一个网络端口由于过度激进的网络成员超时而关闭的情况。
  • 是的,我能够检索记录,所以这可能不是与防火墙相关的问题,因为如果是这样,我根本就不会得到记录。此外,我已将套接字超时设置为 2000 毫秒,将连接超时设置为 2000 毫秒。会不会因为java驱动和mongodb版本兼容而出现这个问题?(我用的是mongodb 1.6.5,mongo+java驱动版本是2.4)

标签: java mongodb mongo-java


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2020-09-30
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    相关资源
    最近更新 更多