【发布时间】:2012-10-06 17:51:57
【问题描述】:
我在使用 casbah / java driver. 时遇到了一个奇怪的问题
当驱动程序尝试从 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 解决这个问题时遇到了困难,但我始终发现,导致引发此错误的查询的请求/响应链具有来自 MongoDB 的“TCP Window Full”响应:
我正在使用的版本:
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?
-
有问题的代码是:
if ( _len > ( 32 * 1024 * 1024 ) ) throw new IllegalArgumentException( "response too long: " + _len );其中 _len 是从服务器发送的响应的前四个字节。所以它要么是网络损坏,要么是服务器或驱动程序中的错误。服务器日志中是否有任何内容? 2.9.0是当前稳定版驱动,(2.9.1)[jira.mongodb.org/browse/JAVA-660]. 2.9.2 将包含一个修复程序,应该会在本周晚些时候发布。本周可以将驱动程序升级到 2.9.0 或 2.9.2 吗?
标签: java mongodb mongodb-java casbah