mongodb Сброс соединения по пиру: ошибка записи в сокет - PullRequest
1 голос
/ 06 марта 2012

Я получаю сообщение об ошибке ниже " иногда " во время обновления mongodb

2012-03-06 00: 09: 39,733 SEVERE [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 Ответ

1 голос
/ 06 марта 2012

Вероятно, это связано с тем, что драйвер не переподключается к mongodb после исключения тайм-аута, вы должны обработать его вручную в своем коде.

Драйвер не может удалить пропущенный сокет из соединения из пула, пока ваш код не попытается его использовать. Так что в общем случае вам нужно try {} catch {} и повторить обновление дважды, если во второй раз вы получите ошибку, вы должны выбросить ее.

По крайней мере, драйвер c # имеет такое же поведение, потому что он не может реально контролировать и удалять удаленные сокеты (потому что они могут быть закрыты в любое время), поэтому вам нужно просто обработать его вручную.

...