我们有一个 Scala 服务器,它使用由Casbah包装的 Java MongoDB 驱动程序。最近,我们使用 Mongo API 将其数据库从实际的 MongoDB 切换到 Azure CosmosDB。这通常工作正常,但是每隔一段时间,对 Cosmos 的调用就会失败,并出现 MongoSocketWriteException(下面的堆栈跟踪)。
我们将客户端创建为
import com.mongodb.casbah.Imports._
val mongoUrl = "mongodb://username:password@host.documents.azure.com:10255/?ssl=true&replicaSet=globaldb"
val client = MongoClient(MongoClientURI(mongoUrl))
val collection: MongoCollection = client("mongoDatabase")("mongoCollection")
对于这个看似相似的错误(如何解决 MongoError:连接到 CosmosDB 时损坏的池),我们尝试&replicaSet=globaldb
按照建议的解决方法从连接 URI 中删除,但它没有解决问题。
堆栈跟踪:
com.mongodb.MongoSocketWriteException: Exception sending message
at com.mongodb.connection.InternalStreamConnection.translateWriteException(InternalStreamConnection.java:462)
at com.mongodb.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:205)
at com.mongodb.connection.UsageTrackingInternalConnection.sendMessage(UsageTrackingInternalConnection.java:95)
at com.mongodb.connection.DefaultConnectionPool$PooledConnection.sendMessage(DefaultConnectionPool.java:424)
at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:209)
at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:111)
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159)
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)
at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:206)
at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:112)
at com.mongodb.operation.CountOperation$1.call(CountOperation.java:210)
at com.mongodb.operation.CountOperation$1.call(CountOperation.java:206)
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:203)
at com.mongodb.operation.CountOperation.execute(CountOperation.java:206)
at com.mongodb.operation.CountOperation.execute(CountOperation.java:53)
at com.mongodb.Mongo.execute(Mongo.java:772)
at com.mongodb.Mongo$2.execute(Mongo.java:759)
at com.mongodb.DBCollection.getCount(DBCollection.java:962)
at com.mongodb.DBCursor.count(DBCursor.java:670)
at com.mongodb.casbah.MongoCollectionBase.getCount(MongoCollection.scala:496)
at com.mongodb.casbah.MongoCollectionBase.getCount$(MongoCollection.scala:488)
at com.mongodb.casbah.MongoCollection.getCount(MongoCollection.scala:1106)
at com.mongodb.casbah.MongoCollectionBase.count(MongoCollection.scala:897)
at com.mongodb.casbah.MongoCollectionBase.count$(MongoCollection.scala:894)
at com.mongodb.casbah.MongoCollection.count(MongoCollection.scala:1106)
[snip]
Caused by: java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:876)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:847)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at com.mongodb.connection.SocketStream.write(SocketStream.java:75)
at com.mongodb.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:201)
... 38 common frames omitted
(发布这个答案是因为我希望该解决方案对其他人有用,并且因为我欢迎任何进一步的见解。)