java - 有人知道 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
解决方案
这里的相关错误是:
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 服务器的网络连接的问题。
推荐阅读
- java - 如何从 spring-boot 千分尺中检索指标
- c - 当条件为假时,为什么条件包含中的控制组在词汇上是有效的?
- asp.net-core-2.1 - Entity Framework Core 相关数据查询太慢
- python - 使用其他链接器选项编译 PyTorch
- javascript - 将 javascript 日期格式从 yyyy.mm.dd 转换为 dd.mm.yyyy
- ibm-midrange - 图书馆列出并提交作业——AS400
- php - 检查时间字符串是否超出小时数
- java - 从控制器中的变量初始化 TextField 并使用 Fxml
- python - Python中字典结构中的嵌套字典,希望以特定方式输出
- java - 如何在 Spring 中创建多 Web 模块应用程序?