2014-03-04 73 views
3

我看到几个MongoExceptions引起的SocketTimeoutException(请参阅下面的堆栈跟踪)。也就是说,客户端在超时(30秒)内未能获得响应。现在我想知道如何解决它。Mongo中的套接字超时异常

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

 
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) 

回答

6

这些超时是否发生在非活动期之后?很可能您的连接池在闲置太久后变得陈旧。

如果是这样,也有要对这个方法有两种:

  1. 赶上插座超时异常,请立即请求应该能够访问一个新的连接池。 (这是如果你的连接对象自动重新连接选项留为true,这是默认设置。)

  2. 使用自定义保持活跃,来ping mongod的服务器定期使用同一个连接池,因此游泳池保持新鲜。

选项1是容易实现,但默认套接字超时时间为30秒左右是相当过分。您可以根据需要更改此设置。

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