Limitar o tempo de execução do servidor MongoDB
Visão geral
Ao usar o driver Scala para executar uma operação de servidor , você também pode limitar o tempo em que o servidor pode concluir a operação. Para fazer isso, especifique um tempo limite de operação do lado do cliente (CSOT). O tempo limite se aplica a todas as etapas necessárias para concluir a operação, incluindo seleção do servidor , verificação da conexão e execução do lado do servidor. Quando o tempo limite expira, o driver Scala levanta uma exceção de tempo limite.
Observação
Recurso experimental
O recurso CSOT é experimental e pode mudar em futuras versões de drivers.
Opção timeoutMS
Para especificar um tempo limite ao se conectar a um sistema do MongoDB , defina a opção de conexão timeoutMS
para o comprimento de tempo limite em milissegundos. Você pode definir a opção timeoutMS
das seguintes maneiras:
Chamando o método
timeout()
a partir da classeMongoClientSettings.Builder
Definindo o parâmetro
timeoutMS
em sua string de conexão
Os exemplos de código a seguir definem um tempo limite no nível do cliente de 200
milissegundos. Selecione a aba MongoClientSettings ou Connection
String para ver o código correspondente.
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 tempo limite aceitos
A tabela seguinte descreve o comportamento de tempo limite correspondente aos valores aceitos para timeoutMS
:
Valor | Comportamento |
---|---|
número inteiro positivo | Define o tempo limite a ser usado para a conclusão da operação. |
| Especifica que as operações nunca expiram. |
| Defers the timeout behavior to the following settings: These settings are deprecated and are ignored if you set timeoutMS . |
Se você especificar a opção timeoutMS
, o driver aplicará automaticamente o tempo limite especificado para cada operação do servidor . O exemplo de código a seguir especifica um tempo limite de 200
milissegundos no nível do cliente e, em seguida, chama o 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"))
Herança de tempo limite
Quando você especifica a opção timeoutMS
, o driver aplica o tempo limite de acordo com os mesmos comportamentos de herança que as outras opções de driver Scala. A tabela a seguir descreve como o valor do tempo limite é herdado em cada nível:
Nível | Descrição da herança |
---|---|
(operação) | Tem a maior precedência e substitui as opções de tempo limite definidas em qualquer outro nível. |
transação | Tem precedência sobre o valor de tempo limite que você define no nível da sessão, da collection, do banco de dados ou do cliente . |
Sessão | Aplica-se a todas as transações e operações dessa sessão, a menos que você defina um valor de tempo limite diferente para esses níveis. |
Database | Aplica-se a todas as sessões e operações desse banco de dados, a menos que você defina um valor de tempo limite diferente para esses níveis. |
collection | Aplica-se a todas as sessões e operações dessa coleção, a menos que você defina um valor de tempo limite diferente nesses níveis. |
Cliente | Aplica-se a todos os bancos de dados, collections, sessões, transações e operações dentro desse cliente que não especificam de outra forma |
Para obter mais informações sobre substituições e opções específicas, consulte a seguinte seção Substituições.
Substitui
O driver Scala oferece suporte a vários níveis de configuração para controlar o comportamento e o desempenho das operações do banco de dados .
Você pode especificar uma opção timeoutMS
em um nível mais específico para substituir a configuração no nível do cliente. A tabela na seção anterior descreve os níveis nos quais você pode especificar uma configuração de tempo limite. Isso permite que você personalize os tempos limite com base nas necessidades de operações individuais.
O exemplo a seguir demonstra como uma configuração de tempo limite em nível de collection pode substituir uma configuração de tempo limite em nível 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
Transações
Ao criar uma nova instância ScalaClientSession para implementar uma transação, utilize o método defaultTimeout()
ao construir uma instância do ClientSessionOptions
. Você pode utilizar esta opção para especificar o tempo limite para os seguintes métodos:
O seguinte código demonstra como definir o defaultTimeout
ao instanciar um ClientSession
:
val opts = ClientSessionOptions.builder .defaultTimeout(200L, MILLISECONDS) .build val session = mongoClient.startSession(opts) // ... perform operations on ClientSession
Se você não especificar o defaultTimeout
, o driver utilizará o valor de tempo limite definido no MongoClient
pai.
Você também pode definir um tempo limite no nível da transação ligando para o método timeout()
ao criar uma instância TransactionOptions
. A definição desta opção aplica um tempo limite a todas as operações realizadas no escopo da transação:
val transactionOptions = TransactionOptions.builder .timeout(200L, MILLISECONDS) .build
Para saber mais sobre transações, consulte o guia Realizar uma transação.
Criptografia do cliente
Quando você usa a criptografia no nível do campo do lado do cliente (CSFLE), o driver usa a opção timeoutMS
para limitar o tempo permitido para operações de criptografia e descriptografia. Você pode definir uma opção de tempo limite para sua instância ClientEncryption
chamando o método timeout()
ao criar uma instância ClientEncryptionSettings
.
Se você especificar o timeout ao construir uma instância do ClientEncryption
, o timeout controlará a vida útil de todas as operações executadas nessa instância. Se você não fornecer um timeout ao instanciar ClientEncryption
, a instância herdará a configuração de timeout do MongoClient
usado no construtor ClientEncryption
.
Se você definir timeoutMS
no cliente e diretamente em ClientEncryption
, o valor fornecido para ClientEncryption
terá precedência.
Observables
Observable
As instâncias oferecem configurações de tempo limite configuráveis ao usar a funcionalidade CSOT. Você pode ajustar o manuseio do Observable
configurando a vida útil do Observable
. Para configurar o modo de tempo limite, use o método timeoutMode()
ao executar qualquer operação que retorne um resultado que herde Observable
.
Observação
Tempo limite herdado
A definição de um modo de tempo limite do cursor requer que você defina um tempo limite no MongoClientSettings
, em MongoDatabase
ou em MongoCollection
.
Para saber mais sobre observáveis, consulte o guia Acessar dados de um observável.
Modo de vida
O modo de vida útil usa a configuração de tempo limite para limitar a vida útil inteira de um Observable
. Neste modo, seu aplicação deve inicializar o Observable
, concluir todas as chamadas para os métodos Observable
e retornar todos os documentos dentro do limite de tempo especificado. Caso contrário, a vida útil do Observable
expira e o driver gera um erro de tempo limite.
O exemplo a seguir mostra como definir um tempo limite de Observable
para garantir que o cursor seja inicializado e todos os documentos sejam recuperados dentro do tempo limite herdado:
val observableWithLifetimeTimeout = collection .find(gte("age", 40)) .timeoutMode(TimeoutMode.CURSOR_LIFETIME)
GridFS
Você pode definir uma opção de tempo limite para as operações GridFS ao instanciar um GridFSBucket
usando o método withTimeout()
. Esse timeout se aplica a todas as operações realizadas no bucket, como upload e download de dados. Se você não definir um tempo limite, a instância GridFSBucket
herda a configuração de tempo limite do MongoDatabase
com a qual é criada.
O seguinte código demonstra como definir um tempo limite ao instanciar um GridFSBucket
:
val gridFSBucket = GridFSBucket(database).withTimeout(200L, MILLISECONDS)
Importante
Suporte de tempo limite observável
Quando você chama o método uploadFromObservable()
em um GridFSBucket
que tem um tempo limite de operação, podem ocorrer violações de tempo limite porque a classe Observable
não tem suporte inerente ao tempo limite de leitura. Isso pode estender a operação além do limite de tempo limite especificado, causando uma exceção de tempo limite.
Documentação da API
Para saber mais sobre como usar tempos limite com o driver Scala, consulte a seguinte documentação da API: