当前位置: 首页 > 面试题库 >

Mongo中的套接字超时异常

燕朝明
2023-03-14
问题内容

我看到了一些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. 捕获套接字超时异常,您的直接请求应该能够访问新的连接池。(这是如果连接html" target="_blank">对象中的auto-reconnect选项保留为true,这是默认设置。)

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

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

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



 类似资料:
  • 问题内容: 我试图呼吁一个非常繁重的过程。平均工作时间估计为9-10分钟。 当我执行该过程时,我为一个巨大的数字设置了超时时间:99999999。 2分钟后,出现以下错误: java.net.SocketTimeoutException:读取超时 我尝试对其进行更多处理,并将超时设置为3000,并且在预期的3秒钟后出现了相同的错误。 您对为什么将其设置为最大120000 有任何想法吗? 问题答案:

  • 一些背景: 我有一个使用3G或4G数据连接的Android应用程序。但它也连接到一个wifi热点,以便在热点设备和应用程序之间传输一些数据。 我想做的是:创建一个到这个wifi热点的套接字连接,并通过这个套接字发送/接收数据。 我添加了以下代码,以确保我们在创建套接字时使用wifi热点wifi(否则它有时最终会使用数据连接): 这似乎没问题。但是,我在尝试连接到远程服务器地址时发现问题。下面是我正

  • 在同一个集群中的2个ESB实例中,我们不断地获得套接字超时。在日志中打印的IP地址属于负载均衡器,它位于2个ESB实例的顶部。一段时间后,ES实例将进入不健康状态,并且不会服务任何请求。 TID:[-1][][2018-10-07 22:42:11,711]警告{org.apache.synapse.transport.passthru.sourcehandler}-读取请求后连接超时:http-

  • Hi想知道是否有办法设置套接字的超时,以及在连接握手之前重试的次数。我在非常糟糕的连接模式下测试了我的应用程序,我为我在Volley中的请求设置了重试策略为10秒,但SSL握手似乎是个问题,因为它有一个默认的超时设置为60秒,而Volley超时只被触发当套接字由于尝试次数或超时而失败时。 下面是我的方法: 我正在使用截击来提出我的请求,我实现这一点的方法是: 我还尝试设置了这样的超时:

  • 问题内容: 我创建了一个小型聊天程序,当客户端和服务器在同一台计算机(也可能是网络)上运行时,该程序可以完美运行。但是,一旦我尝试通过Internet连接到另一台计算机,套接字连接就会超时。这是由于防火墙/路由器等引起的吗? 以及如何通过互联网连接ServerSocket和套接字? 问题答案: 但是,一旦我尝试通过Internet连接到另一台计算机,套接字连接就会超时。这是由于防火墙/路由器等引起

  • 问题内容: 我想将数据发送到服务器,然后等待一分钟,然后关闭套接字。 怎么做? 问题答案: 你可以试试看 根据您的情况更改套接字的超时!此代码将发送一条消息,然后等待接收消息,直到达到超时!