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

常见问题解答

本页内容

  • 为什么我无法连接到 MongoDB 实例?
  • Kotlin 驱动程序与 KMongo 有何不同?
  • Kotlin 驱动程序与 Kotlin SDK 之间有什么区别?
  • Kotlin 驱动程序中的连接池是如何工作的?

在本页中,您可以找到常见问题及其相应答案。

提示

如果您在本页上找不到问题的答案,请参阅问题与帮助页面,了解如何报告问题。

如果您连接 MongoDB 部署有问题,请参阅连接故障排除指南以获取可能的解决方案。

Kotlin 驱动程序是 MongoDB 的官方 Kotlin 驱动程序。它由 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 相似,但也有一些关键差异

  • The official driver does not have built-in support for reactor, rxjava2, Jackson, or GSON.

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

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

有关更多详细信息,请参阅 从 KMongo 迁移。

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

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

每个MongoClient 实例为其 MongoDB 中的每个服务器都有一个内置的连接池。连接池根据需要打开套接字以支持多线程应用程序中的并发 MongoDB 操作。

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

每个 MongoClient 实例为其 MongoDB 中的每个服务器打开两个额外的套接字以监控服务器状态。

例如,连接到 3 节点副本集的客户端打开 6 个监控套接字。它还会打开每个服务器上支持应用程序线程所需的所有套接字,最多不超过 maxPoolSize 的值。如果 maxPoolSize100 且应用程序仅使用主节点(默认),则只有主连接池会增长,并且最多可以有 106 个总连接。如果应用程序使用读取首选项来查询次级节点,它们的池也会增长,并且可以有 306 个总连接。

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

  • 其中一个现有线程完成了连接创建,或者现有连接被归还到池中。

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

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

您可以使用 maxIdleTimeMS 选项来设置连接在池中保持空闲的最长毫秒数,然后在被移除并用新的连接替换。默认值为 0(无限制)。

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

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

为每个进程创建一个客户端,并重用它执行所有操作。为每个请求创建新的客户端是一个常见的错误,这样做非常低效。

为了在一个进程内支持高并发 MongoDB 操作,您可以增加 maxPoolSize。一旦池达到最大大小,额外的线程将等待套接字变为可用。

驱动程序不会限制等待套接字变为可用的线程数,限制线程池的大小以在负载高峰时限制队列大小是应用程序的责任。线程将在 waitQueueTimeoutMS 选项指定的时间内等待,默认值为 120000(120秒)。

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

当任何线程调用 MongoClient.close() 时,驱动程序将关闭所有空闲套接字,并在它们返回到池中时关闭所有正在使用的套接字。

要了解更多关于连接到 MongoDB 的信息,请参阅连接指南。

返回

API 文档