Mongo中的套接字超时异常


问题内容

我看到了一些MongoExceptions原因SocketTimeoutException(请参阅下面的堆栈跟踪)。也就是说,客户端无法在超时(30秒)内获得响应。现在我想知道如何解决它。

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

由java.net.SocketTimeoutException引起:读取超时

                 java.net.SocketInputStream.socketRead0(本机方法)
                        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. 捕获套接字超时异常,您的直接请求应该能够访问新的连接池。(这是如果连接对象中的auto-reconnect选项保留为true,这是默认设置。)

  2. 使用自定义的保持活动状态,使用相同的连接池定期对mongod服务器执行ping操作,以便该池保持最新状态。

选项1易于实现,但是默认的套接字超时约为30秒,这非常过分。您可以根据需要更改此设置。

选项2有点破烂,涉及线程。