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)
回答:
这些超时是否在闲置一段时间后发生?空闲时间过长后,连接池可能已过时。
如果是这样,有两种解决方法:
捕获套接字超时异常,您的直接请求应该能够访问新的连接池。(这是如果连接对象中的auto-reconnect选项保留为true,这是默认设置。)
使用自定义的保持活动状态,使用相同的连接池定期对mongod服务器执行ping操作,以便该池保持最新状态。
选项1易于实现,但是默认的套接字超时约为30秒,这非常过分。您可以根据需要更改此设置。
选项2有点破烂,涉及线程。
以上是 Mongo中的套接字超时异常 的全部内容, 来源链接: utcz.com/qa/401591.html