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有点破烂,涉及线程。

以上是 Mongo中的套接字超时异常 的全部内容, 来源链接: utcz.com/qa/401591.html

回到顶部