mongodb - Mongo 中的套接字超时异常

标签 mongodb

我看到一些 MongoExceptions 是由 SocketTimeoutException 引起的(参见下面的堆栈跟踪)。也就是说,客户端未能在超时(30 秒)内获得响应。现在我想知道如何修复它。

简单的解决方案是增加超时,但我想先了解根本原因。你有什么建议?

caused by java.net.SocketTimeoutException: Read timed out
                 java.net.SocketInputStream.socketRead0 (Native Method)
                        java.net.SocketInputStream.read (SocketInputStream.java:152)
                        java.net.SocketInputStream.read (SocketInputStream.java:122)
                      java.io.BufferedInputStream.read1 (BufferedInputStream.java:273)
                       java.io.BufferedInputStream.read (BufferedInputStream.java:334)
                com.mongodb.Response$MyInputStream.read (Response.java:168)
               org.bson.BasicBSONDecoder$BSONInput.fill (BasicBSONDecoder.java:386)
     org.bson.BasicBSONDecoder$BSONInput.readUTF8String (BasicBSONDecoder.java:460)
                org.bson.BasicBSONDecoder.decodeElement (BasicBSONDecoder.java:155)
                      org.bson.BasicBSONDecoder._decode (BasicBSONDecoder.java:79)
                       org.bson.BasicBSONDecoder.decode (BasicBSONDecoder.java:57)
                    com.mongodb.DefaultDBDecoder.decode (DefaultDBDecoder.java:61)
                      com.mongodb.Response. (Response.java:83)
                                  com.mongodb.DBPort.go (DBPort.java:142)
                                com.mongodb.DBPort.call (DBPort.java:92)
                   com.mongodb.DBTCPConnector.innerCall (DBTCPConnector.java:244)
                        com.mongodb.DBTCPConnector.call (DBTCPConnector.java:216)
             com.mongodb.DBApiLayer$MyCollection.__find (DBApiLayer.java:288)
             com.mongodb.DBApiLayer$MyCollection.__find (DBApiLayer.java:273)
                       com.mongodb.DBCollection.findOne (DBCollection.java:728)
                       com.mongodb.DBCollection.findOne (DBCollection.java:708)

最佳答案

这些超时是在一段时间不活动后发生的吗?您的连接池很可能在闲置太久后变得陈旧。

如果是这样,有两种方法可以解决这个问题:

  1. 捕获套接字超时异常,您的即时请求应该能够访问新的连接池。 (如果您的连接对象中的自动重新连接选项保留为 true,这是默认设置。)

  2. 使用自定义的 keep-alive,使用相同的连接池定期 ping mongod 服务器,使池保持新鲜。

方案1很容易实现,但是默认的套接字超时时间是30s左右,有点过长。您可以根据需要更改此设置。

选项 2 有点 hack,涉及线程。

关于mongodb - Mongo 中的套接字超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176125/

相关文章:

c# - 如何在不获取整个文档的情况下获取字段的值?

node.js - 是否可以使用查询 select 及其索引来选择数组中的一个元素?

MongoDB 外壳 : find by BinData

javascript - 如何在mongodb中为用户和管理员赋予不同的权限

mongodb - 在数组中拉数组

node.js - 如何编写基于 Node.js 的 cron 作业来删除 MongoDB 集合并发出 db.copyDatabase 命令

java - 通过 json 字符串查询 Spring Data MongoDB

node.js - PassportJS 重命名 "user"对象

php - 更新具有未知修改字段的 MongoDB 集合的最佳实践

c# - PowerShell 与 MongoDB C# 驱动程序的方法不兼容?