mongodb通过对等方重置连接:套接字写入器错误

时间:2012-03-05 22:51:32

标签: java mongodb database-connection

我在更新mongodb

期间收到“有时”下面的错误

2012-03-06 00:09:39,733严重[com.mongodb.tcp](http-0.0.0.0-80-169)调用了MyPort.error java.net.SocketException:通过对等方重置连接:套接字写入错误

at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.bson.io.PoolOutputBuffer.pipe(PoolOutputBuffer.java:113)
at com.mongodb.OutMessage.pipe(OutMessage.java:157)
at com.mongodb.DBPort.go(DBPort.java:92)
at com.mongodb.DBPort.go(DBPort.java:66)
at com.mongodb.DBPort.say(DBPort.java:61)
at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:155)
at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:141)
at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:299)
at com.mongodb.DBCollection.update(DBCollection.java:125)
    at com.zimbra.actions.DataSave.exec(DataSave.java:46)

让我们检查一下DataSave.java:

DBCollection clDatum = com.zimbra.getSystemMongo().getCollection("datum");
BasicDBObject mySearch = new BasicDBObject();
mySearch.put("Id", 12132);
BasicDBObject myReplacement = new BasicDBObject();
myReplacement.put("$set", new BasicDBObject("A.B",
 (JSONObject) JSONValue.parse(request.getParameter("data").toString());));
// I am getting this error here (line 46):
clDatum.update(mySearch, myReplacement, true, true);

如果您认为我尝试写的数据多于服务器耗材,您能否告诉我应该在哪里检查?有什么地方可以改变这个尺寸吗?

或者你能解决这个问题吗?

非常感谢..

1 个答案:

答案 0 :(得分:1)

可能这是因为驱动程序在超时异常后没有重新连接到mongodb,你必须在你的代码中手动处理它。

驱动程序无法从池中删除已删除的套接字,直到您的代码尝试使用它。所以一般来说你需要try {} catch {}并重复更新两次,如果你第二次遇到错误就应该抛出它。

至少c#驱动程序具有相同的行为,因为它无法真正控制和删除已删除的套接字(因为它们可以随时关闭),因此您必须手动处理它。