Overview
Al usar el controlador de Scala 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 de Scala genera una excepción de tiempo de espera.
Nota
Característica experimental
La función CSOT es experimental y podría cambiar en futuras versiones de controladores.
Opción timeoutMS
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. Puede configurar la opción timeoutMS de las siguientes maneras:
Llamar al método
timeout()desde la claseMongoClientSettings.BuilderConfiguración del parámetro
timeoutMSen 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.
val settings = MongoClientSettings.builder .applyConnectionString(ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build val mongoClient = MongoClient(settings)
val uri = "<connection string>/?timeoutMS=200" val mongoClient = MongoClient(uri)
Valores de tiempo de espera aceptados
La siguiente tabla describe el comportamiento del tiempo 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. |
| Especifica que las operaciones nunca expiran. |
| Defers the timeout behavior to the following settings: These settings are deprecated and are ignored if you set timeoutMS. |
Si especifica la opción timeoutMS, el controlador aplica automáticamente el tiempo de espera 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():
val settings = MongoClientSettings.builder .applyConnectionString(ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build val mongoClient = MongoClient(settings) val database = mongoClient.getDatabase("db") val collection = database.getCollection("people") collection.insertOne(Document("name" -> "Francine Loews"))
Herencia de tiempo de espera
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 de Scala. La siguiente tabla describe cómo se hereda el valor del tiempo de espera en cada nivel:
Nivel | Descripción de la herencia |
|---|---|
Operación | Tiene la máxima prioridad y anula las opciones de tiempo de espera que configure en cualquier otro nivel. |
Transacción | Tiene prioridad sobre el valor de tiempo de espera que establezca en el nivel de sesión, colección, base de datos o 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 en 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, colecciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen |
Para obtener más información sobre anulaciones y opciones específicas, consulte la siguiente sección Anulaciones.
Anulaciones
El controlador Scala admite 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:
val settings = MongoClientSettings.builder .applyConnectionString(ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build val mongoClient = MongoClient(settings) val database = mongoClient.getDatabase("db") val collection = database .getCollection("people") .withTimeout(300L, MILLISECONDS) // ... perform operations on MongoCollection
Transacciones
Al crear una nueva instancia de ScalaClientSession 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:
val opts = ClientSessionOptions.builder .defaultTimeout(200L, MILLISECONDS) .build val 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 puede establecer un tiempo de espera a nivel de transacción llamando al método timeout() al crear una instancia TransactionOptions. Al configurar esta opción, se aplica un tiempo de espera a todas las operaciones realizadas dentro del ámbito de la transacción:
val transactionOptions = TransactionOptions.builder .timeout(200L, MILLISECONDS) .build
Para obtener más información sobre las transacciones, consulte la Realizar una guía de transacciones.
Cifrado del cliente
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.
Observables
Observable Las instancias ofrecen opciones de tiempo de espera configurables al usar la función CSOT. Puede ajustar el manejo de Observable configurando el tiempo de vida de Observable. Para configurar el modo de tiempo de espera, utilice el método timeoutMode() al realizar cualquier operación que devuelva un resultado que herede Observable.
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 observables, consulte la guía Acceder a datos desde un observable.
Modo de por vida
El modo de duración utiliza la configuración de tiempo de espera para limitar la duración total de un Observable. En este modo, la aplicación debe inicializar el Observable, completar todas las llamadas a los métodos Observable y devolver todos los documentos dentro del límite de tiempo especificado. De lo contrario, la duración de Observable expira y el controlador genera un error de tiempo de espera.
El siguiente ejemplo muestra cómo establecer un tiempo de espera Observable para garantizar que el cursor esté inicializado y que todos los documentos se recuperen dentro del tiempo de espera heredado:
val observableWithLifetimeTimeout = collection .find(gte("age", 40)) .timeoutMode(TimeoutMode.CURSOR_LIFETIME)
GridFS
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 crear una instancia de GridFSBucket:
val gridFSBucket = GridFSBucket(database).withTimeout(200L, MILLISECONDS)
Importante
Soporte de tiempo de espera observable
Al llamar al método uploadFromObservable() en un GridFSBucket con un tiempo de espera de operación, podrían producirse infracciones de tiempo de espera debido a que la clase Observable carece de compatibilidad inherente con el tiempo de espera de lectura. Esto podría extender la operación más allá del límite de tiempo de espera especificado, lo que provocaría una excepción de tiempo de espera.
Documentación de la API
Para obtener más información sobre el uso de tiempos de espera con el controlador Scala, consulte la siguiente documentación de API: