首页 > 解决方案 > 有人知道 MongoDB 超时异常的修复方法吗?

问题描述

我最近更频繁地收到 MongoDB 超时异常。我编写了一个不和谐的机器人,它依赖于大多数基于公会的功能,昨天它根本无法使用 Java 驱动程序登录到 MongoDB。只是为了对其进行总体概述,我使用了所有最新的驱动程序和依赖项,并且根本不使用任何不推荐使用的方法。

由于这在我自己的代码中不是问题,因此我尝试修改连接超时和不同的网络设置。

以下是控制台中的错误日志(忽略记录器消息):

2020-05-22 18:25 [main] CavenBot [INFO ] - Logging into databases...
2020-05-22 18:25 [main] CavenBot [INFO ] - Logging into MongoDB
Exception in thread "main" com.mongodb.MongoConfigurationException: Unable to look up TXT record for host discord-y3bzo.mongodb.net
    at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:131)
    at com.mongodb.ConnectionString.<init>(ConnectionString.java:378)
    at com.mongodb.client.MongoClients.create(MongoClients.java:61)
    at com.dragons0u1.CavenBot.main(CavenBot.java:37)
Caused by: javax.naming.CommunicationException: DNS error [Root exception is java.net.SocketTimeoutException: Receive timed out]; remaining name 'discord-y3bzo.mongodb.net'
    at jdk.naming.dns/com.sun.jndi.dns.DnsClient.query(DnsClient.java:313)
    at jdk.naming.dns/com.sun.jndi.dns.Resolver.query(Resolver.java:81)
    at jdk.naming.dns/com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:434)
    at java.naming/com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:235)
    at java.naming/com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:141)
    at java.naming/com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:129)
    at java.naming/javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:171)
    at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:114)
    ... 3 more
Caused by: java.net.SocketTimeoutException: Receive timed out
    at java.base/java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
    at java.base/java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:124)
    at java.base/java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:182)
    at java.base/java.net.DatagramSocket.receive(DatagramSocket.java:815)
    at jdk.naming.dns/com.sun.jndi.dns.DnsClient.doUdpQuery(DnsClient.java:423)
    at jdk.naming.dns/com.sun.jndi.dns.DnsClient.query(DnsClient.java:212)
    ... 10 more

标签: javamongodb

解决方案


这里的相关错误是:

Unable to look up TXT record for host discord-y3bzo.mongodb.net
DNS error
java.net.SocketTimeoutException: Receive timed out

这表明您正在使用mongodb+srv样式连接字符串,并且 DnsClient 库正在超时尝试查询 DNS 服务器以获取所需的 TXT 记录以进行连接。

也就是说,这看起来很像 DNS 解析器配置、DNS 服务器或与 DNS 服务器的网络连接的问题。


推荐阅读