文档菜单
文档首页
/ / /
Kotlin 协程

连接故障排除

本页内容

  • 连接错误
  • 检查连接字符串
  • 配置防火墙
  • 身份验证错误
  • 检查连接字符串
  • 验证用户是否在身份验证数据库中
  • 发送消息错误
  • 检查连接字符串
  • 验证用户是否在身份验证数据库中
  • 配置防火墙
  • 检查连接数
  • 超时错误
  • 设置maxConnectionTimeoutMS
  • 设置 maxConnectionLifeTimemaxConnectionIdleTime
  • 检查连接数
  • 额外提示
  • 获取 TLS/SSL 的日志信息

本页提供了解决在使用 MongoDB Kotlin 驱动程序连接到 MongoDB 实例或副本集时可能遇到的问题的潜在方案。

注意

本页仅列出连接问题。如果您遇到其他 MongoDB 问题,请考虑以下资源

  • The常见问题解答 (FAQ) 关于 Kotlin 驱动程序

  • 问题与帮助 主题,有关报告错误、为驱动程序做出贡献和其他资源信息

  • TheMongoDB 社区论坛 用于提问、讨论或一般技术支持

以下错误消息是一个通用消息,表示驱动程序无法连接到指定主机名或端口的服务器

Error: couldn't connect to server 127.0.0.1:27017

如果您收到此错误,请尝试以下方法解决问题。

验证连接字符串中的主机名和端口号是否准确。在示例错误消息中,主机名为127.0.0.1,端口号为 27017。MongoDB 实例的默认端口号为 27017,但您可以配置 MongoDB 在其他端口号上通信。

假设您的MongoDB部署使用默认端口,请验证防火墙已打开端口27017。如果您的部署使用的是其他端口,请验证该端口在防火墙中已打开。

重要

除非您确信是MongoDB实例使用的端口,否则请不要在防火墙中打开端口。

Kotlin驱动程序如果认证配置不正确,可能无法连接到MongoDB实例。这通常会导致类似以下错误消息

Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.

如果您收到此错误,请尝试以下方法解决问题。

无效的连接字符串是尝试连接到MongoDB时认证问题最常见的原因。

注意

有关使用Kotlin驱动程序连接字符串的更多信息,请参阅连接指南中的连接URI

如果您的连接字符串包含用户名和密码,请确保它们格式正确。

注意

如果用户名或密码包含以下任何字符,它们必须进行百分号编码:百分号编码:

: / ? # [ ] @

如果你的MongoDB部署在MongoDB Atlas上,你可以通过使用Atlas连接示例来检查你的连接字符串。确保将示例中的连接字符串替换为你的连接字符串。

连接到副本集时,你应该在连接字符串中包含副本集中的所有主机。用逗号分隔连接字符串中的每个主机。这使驱动程序能够在其中一个主机不可达时建立连接。

要成功使用用户名和密码进行身份验证,用户名必须在身份验证数据库中定义。默认的身份验证数据库是admin数据库。要使用不同的数据库进行身份验证,请在连接字符串中指定authSource。以下示例指示驱动程序使用users作为身份验证数据库

val mongoClient =
MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users")

当您通过驱动程序发送请求且无法发送命令时,通常会显示以下通用错误消息

com.mongodb.MongoSocketWriteException: Exception sending message

如果您收到此错误,请尝试以下方法解决问题。

验证您的应用程序中的连接字符串是否准确。这在《连接错误》和《认证错误》中进行了描述。

用户需要在您的认证数据库中识别。这在《认证错误》中进行了描述。

防火墙需要有一个开放的端口来与MongoDB实例进行通信。这在本节“连接错误。”中进行了描述。

每个MongoClient实例在其连接池中支持的最大并发打开连接数。配置参数maxPoolSize定义了这个值,默认设置为100。如果已存在等于maxPoolSize的打开连接数,服务器将等待直到一个连接变得可用。如果这个等待时间超过了maxIdleTimeMS值,驱动器会响应一个错误。

有时,当您通过驱动器向服务器发送消息时,消息的响应需要一些时间。当这种情况发生时,您可能会收到类似于以下错误消息之一的消息

Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description

如果您收到这些错误之一,请尝试以下方法解决问题。

maxConnectionTimeoutMS 选项表示 Kotlin 驱动程序在超时之前等待连接的时间量。默认值为 10000。您可以增加此值或将它设置为 0,以便驱动程序永远不会超时。

考虑设置 maxConnectionLifeTimemaxConnectionIdleTime。这些参数配置了与 MongoDB 实例保持连接的最长时间。有关这些参数的更多信息,请参阅 连接池设置。

您可能打开了太多的连接。解决方法请参阅发送消息错误。

虽然这部分内容与特定错误信息无关,但其中包含的信息在尝试解决连接问题时可能非常有用。

当使用TLS/SSL时,您可以使用系统属性-Djavax.net.debug=all来查看额外的日志语句。这有助于在尝试调试任何连接问题时。请参阅Oracle关于调试TLS/SSL连接的指南获取更多信息。

返回

常见问题解答