Docs 菜单
Docs 主页
/ / /
Kotlin 协程

连接故障排除

在此页面上

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

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

注意

此页面仅列出连接问题。 如果您在使用 MongoDB 时遇到任何其他问题,请考虑以下资源:

  • Kotlin驾驶员的常见问题常见问题解答

  • 问题和帮助主题,提供有关报告错误、贡献驱动程序和其他资源的信息

  • MongoDB Community论坛,用于提问、讨论或获取一般技术支持

以下错误消息属于一般性消息,指示驱动程序无法通过指定主机名或端口连接到服务器。

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

如果收到这条错误消息,请尝试采用以下方法来解决问题。

验证应用中的连接string是否准确。 连接错误身份验证错误中对此进行了描述。

需要在身份验证数据库中识别该用户。 身份验证错误中对此进行了描述。

防火墙需要有一个开放端口,用于与 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 连接调试指南 以了解更多信息。

后退

FAQ