为什么我在使用Casbah / Java MongoDB驱动程序时会出现java.lang.IllegalArgumentException错误?

41

使用casbah/java驱动程序时,我遇到了一个奇怪的问题。

当驱动程序尝试从Mongo创建响应时,我一直遇到以下异常:


  Oct 16, 2012 10:45:07 AM com.mongodb.DBTCPConnector$MyPort error
  SEVERE: MyPort.error called
  java.lang.IllegalArgumentException: response too long: 1634610484
    at com.mongodb.Response.(Response.java:40)
    at com.mongodb.DBPort.go(DBPort.java:110)
    at com.mongodb.DBPort.go(DBPort.java:75)
    at com.mongodb.DBPort.call(DBPort.java:65)
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:201)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295)
    at com.mongodb.DBCursor._check(DBCursor.java:354)
    at com.mongodb.DBCursor._hasNext(DBCursor.java:484)
    at com.mongodb.DBCursor.hasNext(DBCursor.java:509)
    at com.mongodb.casbah.MongoCursorBase$class.hasNext(MongoCursor.scala:73)
    at com.mongodb.casbah.MongoCursor.hasNext(MongoCursor.scala:497)
    at scala.collection.Iterator$class.foreach(Iterator.scala:660)
    at com.mongodb.casbah.MongoCursor.foreach(MongoCursor.scala:497)
        ...

这似乎是随机发生的,即使在mongo不应从查询返回任何结果的情况下也会发生。所报告的大小不一致,通常比它应该或可能的要大得多。

我猜这可能是响应的某种形式的损坏。我用Wireshark难以理解这个问题,但我始终发现,在导致此错误的查询之前引导请求/响应链的"TCP窗口已满"响应来自MongoDB:

enter image description here

我使用的版本:


 Casbah: 2.1.5.0
 Mongo Java Driver: 2.5.3
 MongoDB: 2.2

如果有人能给出任何关于我可能做错了什么或如何进一步调试此问题的指针,我将不胜感激。

更新:经过查看Casbah 2.1.5.0的发布说明,似乎正在使用的Java驱动程序版本为2.5.3,而不是2.7.3


MongoDB的Java驱动程序当前版本是2.9.1。你可以检查一件事,你是否正在进行大量的写入操作(插入或更新)。如果是的话,你使用了什么级别的writeConcern? - Asya Kamsky
17
需要翻译的内容:代码如下:if ( _len > ( 32 * 1024 * 1024 ) ) throw new IllegalArgumentException( "response too long: " + _len );其中_len是从服务器发送的响应的前四个字节。因此,这可能是网络数据损坏、服务器或驱动程序中的错误。请检查一下服务器日志是否有异常信息?2.9.0是当前稳定版本的驱动程序,在2.9.1中存在一个错误[https://jira.mongodb.org/browse/JAVA-660]。修复该错误的版本2.9.2将在本周晚些时候发布。请问您能否在本周升级到2.9.0或2.9.2版本的驱动程序呢? - Mark Hillick
2个回答

3

1

你的JSON对象有多大?看看这个大对象是否被mongodb的版本所支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接