2012-03-05 1 views
1

Je reçois l'erreur ci-dessous "parfois" lors de la mise à jour mongodbmongodb Connexion réinitialisée par les pairs: socket erreur écrivain

2012-03-06 00: 09: 39733 GRAVES [com.mongodb.tcp] (http -0.0.0.0-80-169) MyPort.error appelé java.net.SocketException: Connexion réinitialisée par les pairs: socket erreur d'écriture

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) 

Vérifions 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); 

Si vous pensez que j'essaie d'écrire plus de données que le serveur fournit, pouvez-vous me dire où dois-je vérifier? Y a-t-il un endroit où changer cette taille?

Ou pourriez-vous me passer une idée pour résoudre ce problème?

Merci beaucoup ..

Répondre

1

C'est probablement parce que pilote ne se reconnecte pas à MongoDB après exception délai d'attente, vous devez gérer manuellement dans votre code.

Le pilote ne peut pas supprimer le socket supprimé de la connexion du pool tant que votre code ne l'a pas utilisé. Donc, en général, vous avez besoin try {} catch {} et répétez la mise à jour deux fois, si la deuxième fois que vous obtenez une erreur, vous devriez le jeter.

Au moins le pilote C# a le même comportement, car il ne peut pas vraiment contrôler et supprimer les sockets perdus (car ils peuvent être fermés à tout moment), vous devez donc le gérer manuellement.

Questions connexes