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

FAQ

在此页面上

  • 为什么我在连接 MongoDB 实例时出现问题?
  • Kotlin 驱动程序与 KMongo 有何不同?
  • Kotlin 驱动程序和 Kotlin SDK 之间有什么区别?
  • 连接池化在 Kotlin 驱动程序中是如何工作的?

在此页面上,您可以找到常见问题解答。

提示

如果在此页面上找不到问题的回答,请参阅问题和帮助页面,了解如何报告问题。

如果在连接到 MongoDB 部署时出现问题,请参阅连接故障排除指南,了解潜在的解决方案。

Kotlin 驱动程序是 Kotlin 的官方 MongoDB 驱动程序。 它由 MongoDB 团队开发,为 Kotlin 应用程序连接到 MongoDB 并处理数据提供原生 API。 它是通过包装 MongoDB Java 驱动程序来实现的。

KMongo 是一个由社区开发的流行库,用于从 Kotlin 应用程序使用 MongoDB。它是 Java 驱动程序的包装器,在创建官方 Kotlin 驱动程序之前创建,以满足 Kotlin 社区的需求。

重要

自 2023 年 7 月起,KMongo 已被标记为已弃用。

Kotlin 驱动程序是与 KMongo 创建者 Julien Buret 合作开发的,旨在为用户提供官方支持的驱动程序。

官方 Kotlin 驱动程序和 KMongo 通常具有相似的 API。 Kotlin 驱动程序和 KMongo 之间的显着相似之处包括:

  • 支持同步和基于协程的操作

  • 支持使用数据类表示 MongoDB 文档

  • 支持 KotlinX 序列化

  • 支持 MongoDB CRUD API 和聚合

虽然官方 Kotlin 驱动程序和 KMongo 很相似,但存在一些关键区别:

  • 官方驱动程序 没有 Reactor 的内置支持 , rxjava2 , Jackson ,或 GSON。

  • 官方驱动程序支持 MongoDB Shell 命令。

  • 官方驱动程序支持使用 Builders API 进行类型安全查询,而 KMongo 使用中缀函数和属性引用进行类型安全查询。

如需了解更多详情,请参阅《从 KMongo 迁移》。

MongoDB 支持使用 Kotlin 进行移动端和服务器端开发。 如果您正在开发适用于 Android 或 Kotlin Multiplatform (KMP) 的移动应用程序,则可以使用MongoDB Atlas Device Kotlin SDK来访问 Atlas App Services 并管理 Realm 数据。

Kotlin 驱动程序通过提供用于构建惯用的 Kotlin 应用程序的完整库来支持服务器端开发。 您可以在 Kotlin 协程驱动程序的本文档中了解如何开发异步应用程序,也可以查看Kotlin 同步驱动程序文档以了解有关同步编程的更多信息。

对于 MongoDB 拓扑结构中的每个服务器,每个 MongoClient 实例都有一个内置连接池。连接池按需打开套接字以支持多线程应用程序中的并发 MongoDB 操作。

每个连接池的最大大小由 maxPoolSize 选项设置,默认值为 100。如果某个服务器的在用连接数达到 maxPoolSize 值,则对该服务器的下一个请求将等待,直到出现可用连接。

每个MongoClient实例会为 MongoDB 拓扑结构中的每个服务器再打开两个套接字,用于监控服务器的状态。

例如,连接到 3 节点副本集的客户端会打开 6 个监控套接字。 它还根据需要打开任意数量的套接字以支持每台服务器上的应用程序线程,最多可达maxPoolSize的值。 如果maxPoolSize100且应用程序仅使用主节点(默认),则只有主节点连接池会增长,总连接数最多可为106 。 如果应用程序使用读取偏好(read preference)来查询从节点,则其池也会增长,总连接数可能为306

此外,连接池的速率受到限制,因此每个连接池在任何时候最多只能并行创建maxConnecting个连接。 任何其他线程在以下情况下都会停止等待:

  • 现有线程之一完成连接创建,或者现有连接重新签入池中。

  • 由于对创建连接的速率有限制,驱动程序重用现有连接的能力得到了提高。

您可以使用minPoolSize选项设置每个服务器的最小并发连接数,默认为0 。 连接池将使用此数量的套接字进行初始化。 如果套接字由于任何网络错误而关闭,导致套接字总数(包括使用中的和空闲的)下降到最小值以下,则会打开更多套接字,直到达到最小值。

您可以使用maxIdleTimeMS选项设置连接在被删除和替换之前在池中保持空闲状态的最大毫秒数,该选项默认为0 (无限制)。

以下 MongoClient 的默认配置适用于大多数应用程序:

val client = MongoClient("<connection string>")

为每个进程创建一个客户端,并在所有操作中重复使用。为每个请求创建一个新客户端是个常见的错误,效率非常低。

要在一个进程中支持大量并发 MongoDB 操作,可以增加maxPoolSize 。 一旦池达到其最大大小,就会有其他线程等待套接字变为可用状态。

该驱动程序不限制可以等待套接字变为可用状态的线程数,并且应用程序有责任在负载峰值期间将其池的大小限制为绑定队列。 线程等待waitQueueTimeoutMS选项中指定的时间,默认为120000 (120 秒)。

如果线程等待套接字的时间超过waitQueueTimeoutMS定义的时长,则会引发连接错误。 如果在负载峰值期间限制操作的持续时间比完成每个操作更重要,请使用此选项。

MongoClient.close() 被任何线程调用时,驱动程序会关闭所有闲置套接字,并关闭所有正在使用的套接字,因为这些套接字会返回到池中。

如需了解有关连接 MongoDB 的更多信息,请参阅“连接指南”。

后退

API 文档