Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Limite el tiempo de ejecución del servidor

Al usar el controlador Java para realizar una operación de servidor, también puede limitar el tiempo que el servidor tarda en finalizarla. Para ello, especifique un tiempo de espera de operación del lado del cliente (CSOT). Este tiempo de espera se aplica a todos los pasos necesarios para completar la operación, incluyendo la selección del servidor, la verificación de la conexión y la ejecución del servidor. Cuando se agota el tiempo de espera, el controlador Java genera una excepción de tiempo de espera.

Nota

Funcionalidad Experimental

La funcionalidad CSOT es experimental y podría cambiar en futuras versiones de driver.

Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, configure el timeoutMS opción de conexión para la duración del tiempo de espera en milisegundos. Puedes establecer la opción timeoutMS de las siguientes maneras:

  • Llamar al método timeout() desde la clase MongoClientSettings.Builder

  • Configuración del parámetro timeoutMS en su cadena de conexión

Los siguientes ejemplos de código establecen un tiempo de espera a nivel de cliente de 200 milisegundos. Seleccione el MongoClientSettings o la pestaña Connection String para ver el código correspondiente.

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<connection string>"))
.timeout(200L, MILLISECONDS)
.build();
MongoClient mongoClient = MongoClients.create(settings);
String uri = "<connection string>/?timeoutMS=200";
MongoClient mongoClient = MongoClients.create(uri);

La siguiente tabla describe el comportamiento de espera correspondiente a los valores aceptados para timeoutMS:

Valor
Comportamiento

Número entero positivo

Establece el tiempo de espera que se utilizará para completar la operación.

0

Especifica que las operaciones nunca expiran.

null o desactivar

Defers the timeout behavior to the following settings:
  • waitQueueTimeoutMS

  • socketTimeoutMS

  • wTimeoutMS

  • maxTimeMS

  • maxCommitTimeMS

These settings are deprecated and are ignored if you set timeoutMS.

Si se especifica la opción timeoutMS, el driver aplica automáticamente el timeout especificado a cada operación del servidor. El siguiente ejemplo de código especifica un tiempo de espera de 200 milisegundos a nivel de cliente y luego llama al método MongoCollection.insertOne():

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<connection string>"))
.timeout(200L, MILLISECONDS)
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("db");
MongoCollection<Document> collection = database.getCollection("people");
collection.insertOne(new Document("name", "Francine Loews"));
}

Al especificar la opción timeoutMS, el controlador aplica el tiempo de espera según los mismos comportamientos de herencia que las demás opciones del controlador Java. La siguiente tabla describe cómo se hereda el valor del tiempo de espera en cada nivel:

Nivel
Descripción de herencia

Operación

Tiene la máxima prioridad y anula las opciones de tiempo de espera que estableciste en cualquier otro nivel.

transacción

Tiene prioridad sobre el valor de tiempo de espera que fija en la sesión, colección, base de datos o nivel de cliente.

sesión

Se aplica a todas las transacciones y operaciones dentro de esa sesión, a menos que establezca un valor de tiempo de espera diferente a esos niveles.

Database

Se aplica a todas las sesiones y operaciones dentro de esa base de datos, a menos que establezca un valor de tiempo de espera diferente en esos niveles.

Colección

Se aplica a todas las sesiones y operaciones sobre esa colección, a menos que establezcas un valor de tiempo de espera diferente en esos niveles.

Cliente

Se aplica a todas las bases de datos, recopilaciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen de otra manera timeoutMS.

Para obtener más información sobre anulaciones y opciones específicas, consulte la siguiente sección Anulaciones.

El driver Java ofrece soporte a varios niveles de configuración para controlar el comportamiento y el rendimiento de las operaciones de la base de datos.

Puede especificar una opción timeoutMS en un nivel más específico para anular la configuración del cliente. La tabla de la sección anterior describe los niveles en los que puede especificar un tiempo de espera. Esto le permite personalizar los tiempos de espera según las necesidades de cada operación.

El siguiente ejemplo demuestra cómo una configuración de tiempo de espera a nivel de colección puede anular una configuración de tiempo de espera a nivel de cliente:

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<connection string>"))
.timeout(200L, MILLISECONDS)
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("db");
MongoCollection<Document> collection = database
.getCollection("people")
.withTimeout(300L, MILLISECONDS);
// ... perform operations on MongoCollection
}

Al crear una nueva instancia de ClientSession para implementar una transacción, utilice el defaultTimeout() método al crear una ClientSessionOptions instancia. Puede usar esta opción para especificar el tiempo de espera de los siguientes métodos:

El siguiente código muestra cómo configurar el defaultTimeout al crear una instancia de un ClientSession:

ClientSessionOptions opts = ClientSessionOptions.builder()
.defaultTimeout(200L, MILLISECONDS)
.build();
ClientSession session = mongoClient.startSession(opts);
// ... perform operations on ClientSession

Si no especifica defaultTimeout, el controlador utiliza el valor de tiempo de espera establecido en el elemento principal MongoClient.

También puedes establecer un tiempo de espera a nivel de transacción llamando al método timeout() al crear una instancia de TransactionOptions. La configuración de esta opción aplica un tiempo de espera a todas las operaciones realizadas en el ámbito de la transacción:

TransactionOptions transactionOptions = TransactionOptions.builder()
.timeout(200L, MILLISECONDS)
.build();

Para obtener más información sobre las transacciones, consulte la Transactions guide.

Cuando usas la Encriptación de Campo a Nivel de Cliente (CSFLE), el driver utiliza la opción timeoutMS para limitar el tiempo permitido para las operaciones de encriptación y desencriptación. Puedes configurar una opción de tiempo de espera para tu instancia de ClientEncryption llamando al método timeout() al crear una instancia de ClientEncryptionSettings.

Si especifica el tiempo de espera al construir una instancia ClientEncryption, este controla la duración de todas las operaciones realizadas en esa instancia. Si no proporciona un tiempo de espera al instanciar ClientEncryption, la instancia hereda el valor de tiempo de espera del MongoClient utilizado en el constructor ClientEncryption.

Si se establece timeoutMS tanto en el cliente como directamente en ClientEncryption, se le da prioridad al valor que se proporciona a ClientEncryption.

Los cursores ofrecen ajustes configurables de tiempo de espera a utilizar la funcionalidad CSOT. Puedes ajustar el manejo del cursor configurando el tiempo de vida del cursor o el modo de iteración del cursor. Para configurar el modo de tiempo de espera, utiliza el método timeoutMode() al realizar cualquier operación que devuelva un Iterable.

Para las operaciones que crean cursores, la configuración del tiempo de espera puede limitar la vida útil del cursor o aplicarse por separado a la operación original y a todas las llamadas subsecuentes.

Nota

Tiempo de espera heredado

Para configurar un modo de tiempo de espera del cursor es necesario configurar un tiempo de espera en MongoClientSettings, en MongoDatabase o en MongoCollection.

Para obtener más información sobre los cursores, consulte la Guía de acceso a datos desde un cursor.

El modo de tiempo de vida del cursor utiliza la configuración de tiempo de espera para limitar toda la vida útil de un cursor. En este modo, tu aplicación debe inicializar el cursor, completar todas las llamadas a los métodos del cursor y devolver todos los documentos dentro del límite de tiempo especificado. De lo contrario, el tiempo de vida del cursor expira y el driver genera un error de tiempo de espera.

Cuando cierras un cursor llamando al método close(), el tiempo de espera se restablece para el comando killCursors para asegurar que los recursos del servidor se limpien.

El siguiente ejemplo muestra cómo configurar un tiempo de espera del cursor para asegurar que el cursor esté inicializado y que todos los documentos se recuperen dentro del tiempo de espera heredado:

FindIterable<Document> cursorWithLifetimeTimeout = collection
.find(gte("age", 40))
.timeoutMode(TimeoutMode.CURSOR_LIFETIME);

El modo de iteración del cursor establece el tiempo de espera para limitar cada llamada a los métodos next(), hasNext() y tryNext(). El tiempo de espera se actualiza tras cada llamada. Este es el modo predeterminado para todos los cursores adaptables, como los cursores adaptables devueltos por el método find() en colecciones limitadas o flujos de cambios.

El siguiente ejemplo de código itera sobre documentos en la colección db.people usando un cursor con el modo de tiempo de espera ITERATION, y luego recupera e imprime el valor del campo name para cada documento:

try (MongoCursor<Document> cursorWithIterationTimeout = collection
.find(gte("age", 40))
.timeoutMode(TimeoutMode.ITERATION)
.cursor()
) {
while (cursorWithIterationTimeout.hasNext()) {
System.out.println(cursorWithIterationTimeout.next().toJson());
}
}

Puede configurar un tiempo de espera para las operaciones de GridFS al crear una instancia GridFSBucket mediante el withTimeout() método. Este tiempo de espera se aplica a todas las operaciones realizadas en el bucket, como la carga y descarga de datos. Si no configura un tiempo de espera, la GridFSBucket instancia hereda la configuración de tiempo de espera de la MongoDatabase instancia con la que se creó.

El siguiente código demuestra cómo establecer un tiempo de espera al instanciar un GridFSBucket:

GridFSBucket gridFSBucket = GridFSBuckets
.create(database)
.withTimeout(200L, MILLISECONDS);

Importante

Compatibilidad con el tiempo de espera de InputStream

Cuando se invoca el método uploadFromStream() en un GridFSBucket que tiene un tiempo de espera de operación, pueden ocurrir incumplimientos de tiempo de espera porque la clase InputStream carece de soporte inherente para tiempo de espera de lectura. Esto podría extender la operación más allá del límite de tiempo de espera especificado, causando una excepción de tiempo de espera.

Para obtener más información sobre el uso de timeouts con el driver Java, consulta la siguiente documentación de la API:

Volver

Stable API

En esta página