2012-03-05 13 views
1

私は、更新MongoDBの中に "時々" 以下のエラーが発生しますソケットライターエラーMongoDBの接続のリセット:

2012-03-06 00:09:39733 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

おそらく、これはドライバーがタイムアウト例外の後MongoDBのために再接続していないので、あなたのコード内で手動でそれを処理する必要があります。

ドライバーは、ドロップされたソケットをコードから使用しようとするまでプールからの接続を削除できません。したがって、一般的にはtry {} catch {}が必要で、2回目の更新を繰り返します.2回目にエラーが発生した場合は、それを投げてください。

少なくともC#ドライバはドロップされたソケットを実際に制御したり削除したりすることができないため、同じ動作をします(いつでも閉じることができるため)。