Overview
本页包含的代码示例展示了如何使用各种设置Kotlin应用程序连接到MongoDB 。
提示
要了解有关此页面上的连接选项的更多信息,请参阅每个部分中提供的链接。
要使用此页面中的连接示例,请将代码示例复制到您的应用程序中。请务必将代码示例中的所有占位符(例如 <hostname>)替换为MongoDB 部署的相关值。
示例应用程序
您可以使用以下示例应用程序来测试本页上的连接代码示例:
import com.mongodb.kotlin.client.coroutine.MongoClient import com.mongodb.kotlin.client.coroutine.MongoDatabase import kotlinx.coroutines.runBlocking import org.bson.Document import org.bson.BsonInt32 import com.mongodb.MongoException fun main() = runBlocking { // Replace the placeholder with your connection string val uri = "<connection string>" // Create a new client and connect to the server val mongoClient = MongoClient.create(uri) val database: MongoDatabase = mongoClient.getDatabase("test") try { // Send a ping to confirm a successful connection val command = Document("ping", BsonInt32(1)) val commandResult = database.runCommand(command) println("Ping response: $commandResult") println("Pinged your deployment. You successfully connected to MongoDB!") } catch (me: MongoException) { System.err.println(me) } }
连接
以下部分介绍如何连接到不同的目标,例如MongoDB的本地实例或Atlas上的云托管实例。
本地部署
以下代码显示了如何连接到本地MongoDB 部署:
val uri = "mongodb://localhost:27017/" val client = MongoClient.create(uri)
Atlas
以下代码展示了如何连接到Atlas上托管的部署:
import com.mongodb.kotlin.client.coroutine.MongoClient import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString import com.mongodb.ServerApi import com.mongodb.ServerApiVersion val uri = "<Atlas connection string>" val serverApi = ServerApi.builder() .version(ServerApiVersion.V1) .strict(true) .deprecationErrors(true) .build() val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .serverApi(serverApi) .build() val client = MongoClient.create(settings)
副本集(Replica Set)
以下代码显示了如何连接到副本集:
val uri = "mongodb://<replica set member>:<port>/?replicaSet=<replica set name>" val client = MongoClient.create(uri)
服务器选择
以下代码演示如何指定服务器选择函数:
import com.mongodb.kotlin.client.coroutine.MongoClient import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString val uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>" val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .serverSelector(<selector function>) .build() val client = MongoClient.create(settings)
要学习;了解有关自定义服务器选择的更多信息,请参阅 自定义服务器选择。
Stable API
以下代码展示了如何为连接指定 Stable API设置:
import com.mongodb.kotlin.client.coroutine.MongoClient import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString import com.mongodb.ServerApi import com.mongodb.ServerApiVersion val uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>" val serverApi = ServerApi.builder() .version(ServerApiVersion.V1) .build() val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .serverApi(serverApi) .build() val client = MongoClient.create(settings)
要了解有关stable API的更多信息,请参阅stable API 。
限制MongoDB Server执行时间
注意
实验功能
CSOT功能是实验性的,可能在未来的驱动程序发布中发生变化。
timeoutMS 连接选项
以下代码演示如何使用 timeoutMS 连接选项设立客户端超时:
import com.mongodb.kotlin.client.coroutine.MongoClient import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString import java.util.concurrent.TimeUnit val uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>" val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .timeout(200L, TimeUnit.MILLISECONDS) .build() val client = MongoClient.create(settings)
import com.mongodb.kotlin.client.coroutine.MongoClient val uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?timeoutMS=<timeout length>" val client = MongoClient.create(uri)
要了解有关客户端超时的更多信息,请参阅限制MongoDB Server执行时间。
连接池
对于 MongoDB 拓扑结构中的每个服务器,每个 MongoClient 实例都有一个内置连接池。连接池按需打开套接字以支持多线程应用程序中的并发 MongoDB 操作。
每个连接池的最大大小由 maxPoolSize 选项设置,默认值为 100。如果某个服务器的在用连接数达到 maxPoolSize 值,则对该服务器的下一个请求将等待,直到出现可用连接。
每个MongoClient实例会为 MongoDB 拓扑结构中的每个服务器再打开两个套接字,用于监控服务器的状态。
例如,连接到 3 节点副本集的客户端会打开 6 个监控套接字。 它还根据需要打开任意数量的套接字以支持每台服务器上的应用程序线程,最多可达maxPoolSize的值。 如果maxPoolSize为100且应用程序仅使用主节点(默认),则只有主节点连接池会增长,总连接数最多可为106 。 如果应用程序使用读取偏好(read preference)来查询从节点,则其池也会增长,总连接数可能为306 。
此外,连接池的速率受到限制,因此每个连接池在任何时候最多只能并行创建maxConnecting个连接。 任何其他线程在以下情况下都会停止等待:
现有线程之一完成连接创建,或者现有连接重新签入池中。
由于对创建连接的速率有限制,驱动程序重用现有连接的能力得到了提高。
您可以使用minPoolSize选项设置每个服务器的最小并发连接数,默认为0 。 连接池将使用此数量的套接字进行初始化。 如果套接字由于任何网络错误而关闭,导致套接字总数(包括使用中的和空闲的)下降到最小值以下,则会打开更多套接字,直到达到最小值。
您可以使用maxIdleTimeMS选项设置连接在被删除和替换之前在池中保持空闲状态的最大毫秒数,该选项默认为0 (无限制)。
以下 MongoClient 的默认配置适用于大多数应用程序:
val client = MongoClient("<connection string>")
为每个进程创建一个客户端,并在所有操作中重复使用。为每个请求创建一个新客户端是个常见的错误,效率非常低。
要在一个进程中支持大量并发 MongoDB 操作,可以增加maxPoolSize 。 一旦池达到其最大大小,就会有其他线程等待套接字变为可用状态。
该驱动程序不限制可以等待套接字变为可用状态的线程数,并且应用程序有责任在负载峰值期间将其池的大小限制为绑定队列。 线程等待waitQueueTimeoutMS选项中指定的时间,默认为120000 (120 秒)。
如果线程等待套接字的时间超过waitQueueTimeoutMS定义的时长,则会引发连接错误。 如果在负载峰值期间限制操作的持续时间比完成每个操作更重要,请使用此选项。
当 MongoClient.close() 被任何线程调用时,驱动程序会关闭所有闲置套接字,并关闭所有正在使用的套接字,因为这些套接字会返回到池中。