Menu Docs
Página inicial do Docs
/ / /
Driver Scala
/

Limitar o tempo de execução do servidor MongoDB

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.

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 classe MongoClientSettings.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)

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.

0

Especifica que as operações nunca expiram.

null ou desmarcar

Defers the timeout behavior to the following settings:
  • waitQueueTimeoutMS

  • socketTimeoutMS

  • wTimeoutMS

  • maxTimeMS

  • maxCommitTimeMS

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"))

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 timeoutMS.

Para obter mais informações sobre substituições e opções específicas, consulte a seguinte seção Substituições.

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

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.

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.

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.

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)

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.

Para saber mais sobre como usar tempos limite com o driver Scala, consulte a seguinte documentação da API:

Voltar

Escolha um destino de conexão

Nesta página