我看到几个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)
这些超时是否发生在一段时间不活动之后?您的连接池很可能在闲置太长时间后变得陈旧。
如果是这样,有两种方法可以解决这个问题:
捕获套接字超时异常,您的立即请求应该能够访问新的连接池。 (这是如果连接对象中的自动重新连接选项保留为 true,这是默认值。)
使用自定义保持活动状态,使用相同的连接池定期 ping mongod 服务器,以便池保持最新状态。
方案1很容易实现,但是默认的socket超时时间在30秒左右,这有点过大了。您可以根据需要更改此设置。
选项 2 有点 hack,涉及线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)