Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

cursor.noCursorTimeout()

Nesta página

  • Definição
  • Comportamento
cursor.noCursorTimeout()

Importante

Método mongosh

Esta página documenta um método mongosh. Esta não é a documentação de um driver de idioma específico, como Node.js.

Para drivers de API do MongoDB, consulte a documentação do driver do MongoDB específica da linguagem.

Instrui o servidor para evitar fechar um cursor automaticamente após um período de inatividade.

O método noCursorTimeout() tem a seguinte forma de protótipo:

db.collection.find(<query>).noCursorTimeout()

Os drivers MongoDB e mongosh associam todas as operações a uma sessão do servidor, com exceção das operações de gravação não reconhecidas. Para operações não explicitamente associadas a uma sessão (ou seja, que usam Mongo.startSession()), os drivers e mongosh do MongoDB criam uma sessão implícita e a associam à operação.

Se uma sessão estiver ociosa por mais de 30 minutos, o servidor MongoDB marcará essa sessão como expirada e poderá fechá-la a qualquer momento. Quando o servidor MongoDB fecha a sessão, ele também elimina todas as operações em andamento e abre os cursores associados à sessão. Isso inclui cursores configurados com noCursorTimeout() ou maxTimeMS() com mais de 30 minutos.

Considere um aplicativo que emite um db.collection.find() com cursor.noCursorTimeout(). O servidor retorna um cursor com um lote de documentos definido pelo cursor.batchSize() do find(). A sessão é atualizada toda vez que o aplicativo solicita um novo lote de documentos do servidor. No entanto, se o aplicativo demorar mais de 30 minutos para processar o lote atual de documentos, a sessão será marcada como expirada e encerrada. Quando o servidor fecha a sessão, ele também mata o cursor apesar de ele estar configurado com noCursorTimeout(). Quando o aplicativo solicita o próximo lote de documentos, o servidor retorna um erro.

Para operações que retornam um cursor, se o cursor ficar inativo por mais de 30 minutos, execute a operação em uma sessão explícita usando e atualize periodicamente Mongo.startSession() refreshSessions a sessão usando o comando. Por exemplo:

var session = db.getMongo().startSession()
var sessionId = session
sessionId // show the sessionId
var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout()
var refreshTimestamp = new Date() // take note of time at operation start
while (cursor.hasNext()) {
// Check if more than 5 minutes have passed since the last refresh
if ( (new Date()-refreshTimestamp)/1000 > 300 ) {
print("refreshing session")
db.adminCommand({"refreshSessions" : [sessionId]})
refreshTimestamp = new Date()
}
// process cursor normally
}

Na operação de exemplo, o método db.collection.find() está associado com uma sessão explícita. O cursor é configurado com cursor.noCursorTimeout() para evitar que o servidor feche o cursor por ociosidade. O loop while inclui um bloco que usa refreshSessions para atualizar a sessão a cada 5 minutos. Como a sessão nunca excederá o tempo-limite de inatividade de 30 minutos, o cursor poderá permanecer aberto indefinidamente.

Para drivers MongoDB, consulte a documentação do driver para obter instruções e sintaxe para criar sessões.

Voltar

cursor.next