限制MongoDB Server执行时间
Overview
使用 Node.js驾驶员执行服务器操作时,还可以限制服务器完成操作所允许的持续时间。 为此,请指定客户端操作超时 (CSOT)。超时适用于完成操作所需的所有步骤,包括服务器选择、连接签出和服务器端执行。 超时后,Node.js驾驶员会引发超时异常。
注意
实验功能
CSOT功能是实验性的,可能在未来的驱动程序发布中发生变化。
timeoutMS 选项
要在连接到MongoDB 部署时指定超时,请将 timeoutMS
连接选项设立为超时长度(以毫秒为单位)。 您可以通过两种方式执行此操作:将参数传递给 MongoClient
构造函数,或通过连接字符串中的参数。
以下代码示例使用timeoutMS
选项指定30秒的超时:
const uri = "mongodb://<hostname:<port>"; const client = new MongoClient(uri, { timeoutMS: 30000 });
const uri = "mongodb://<hostname:<port>?timeoutMS=30000"; const client = new MongoClient(uri);
注意
timeoutMS
连接选项优先于以下选项:
socketTimeoutMS
waitQueueTimeoutMS
wTimeoutMS
maxTimeMS
maxCommitTimeMS
当 CSOT功能不再是实验性时,前面的选项将被弃用。
如果指定 timeoutMS
选项,驾驶员会自动对每个服务器操作应用指定的超时。 以下代码示例在客户端端级别指定 10 秒的超时,然后调用 insertOne()
方法:
const uri = "<connection string uri>"; const client = new MongoClient(uri, { timeoutMS: 10000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); const result = await coll.insertOne({ name: "Yngwie" }); console.log("Insert result:", result); } finally { await client.close(); } } run().catch(console.dir);
超时继承
当您指定 timeoutMS
选项时,驾驶员会根据与其他 Node.js驾驶员选项相同的继承行为应用超时。 下表描述了如何在每个级别继承超时值:
等级 | 继承说明 |
---|---|
操作 | 具有最高优先级,并将覆盖在任何其他级别设立的 |
事务 | 优先于在会话、集合、数据库或客户端级别设立的 |
会话 | 适用于该会话中的所有事务和操作,除非该选项被在这些级别设立的选项覆盖。 |
Database | 适用于该数据库中的所有会话和操作,除非该选项被在这些级别设立的选项覆盖。 |
Collection | 适用于该集合上的所有会话和操作,除非该选项被在这些级别设立的选项覆盖。 |
客户 | 适用于该客户端内未指定 |
覆盖
Node.js驾驶员支持各种级别的配置,以控制数据库操作的行为和性能。
您可以在操作级别指定 timeoutMS
选项,以覆盖特定操作的客户端级别配置。 这允许您根据各个查询的需求自定义超时。
以下示例演示了操作级 timeoutMS
配置如何覆盖客户端级 timeoutMS
配置:
// Creates a new MongoClient with a client-level timeoutMS configuration const uri = "<connection string uri>"; const client = new MongoClient(uri, { // Client-level timeout: 15 seconds timeoutMS: 15000 }); async function run() { try { const db = client.db("test-db"); const coll = db.collection("test-collection"); // Performs a query operation with an operation-level timeoutMS configuration const docs = await coll.find({}, // Operation-level timeout: 10 seconds { timeoutMS: 10000 }) .toArray(); console.log(docs); } finally { await client.close(); } } run().catch(console.dir);
事务
当您创建新的 ClientSession
实例来实现ACID 事务时,请使用 defaultTimeoutMS
选项。 您可以设立defaultTimeoutMS
来指定 timeoutMS
值,以用于:
如果不指定 defaultTimeoutMS
,驾驶员将使用在父项 MongoClient
上设立的timeoutMS
值。
您无法通过在 withTransaction()
回调提供的ACID 事务会话中的操作上设置 timeoutMS
选项来覆盖 defaultTimeoutMS
。 这样做会引发错误。
客户端加密
使用客户端字段级加密(CSFLE) 时,驾驶员使用 timeoutMS
选项来限制加密和解密操作所允许的时间。
如果在构造 ClientEncryption
实例时指定 timeoutMS
选项,它将控制对该实例执行的所有操作的生命周期。 如果您不提供 timeoutMS
,则实例将从 ClientEncryption
构造函数中使用的 MongoClient
继承 timeoutMS
设置。
如果您在客户端上和直接在 ClientEncryption
中同时设立timeoutMS
,则提供给 ClientEncryption
的值优先。
Cursors
使用 CSOT功能时,游标提供可配置的超时设置。 如果需要,可以通过配置游标生存期或游标迭代模式来调整游标处理。 要配置模式,设立为timeoutMode
cursorLifetime
(即默认)或iteration
。
游标生命周期模式
游标生命周期模式使用 timeoutMS
来限制游标的整个生命周期。 在此模式下,游标的初始化以及对游标方法的所有后续调用必须在 timeoutMS
选项指定的限制内完成。 所有文档必须在此限制内退回。 否则,游标的生命周期将到期并出现超时错误。
通过调用 toArray()
或 close()
方法关闭游标时,killCursors
命令的超时时间将重置,以确保清理服务器端资源。
以下示例展示了如何设立timeoutMS
选项,以确保游标初始化并在 10 秒内检索所有文档:
const docs = await collection.find({}, {timeoutMS: 10000}).toArray();
游标迭代模式
游标迭代模式使用 timeoutMS
选项来限制对 next()
、hasNext()
或 tryNext()
方法的每次调用。 每次调用完成后,超时时间都会刷新。 这是所有可追加游标的默认模式,例如 find()
方法在固定大小集合或变更流上返回的可追加游标。
以下代码示例使用游标并将 timeoutMode
设立为 iteration
来遍历 mflix
集合中的文档,然后获取并记录每个电影文档的 imdb_url
:
for await (const movie of mflix.find({}, { timeoutMode: 'iteration' })) { const imdbResponse = await fetch(movie.imdb_url); console.log(await imdbResponse.text()); }
API 文档
要学习;了解有关在 Node.js驾驶员中使用超时的更多信息,请参阅以下API文档: