Menu Docs

Página inicial do DocsDesenvolver aplicaçõesMongoDB DriversDriver Ruby MongoDB

Sessões

Nesta página

  • Criando uma sessão a partir de um Mongo::Client
  • Usando uma sessão
  • Maneira alternativa de criar uma sessão
  • Gravações não reconhecidas
  • Consistência causal
  • Encerrar uma sessão

A versão 3.6 do MongoDB Server introduz o conceito de sessões lógicas para os clientes. Uma sessão é um conceito abstrato que representa um conjunto de operações sequenciais executadas por um aplicativo que está relacionado de alguma forma. Um objeto de sessão pode ser criado por meio de um Mongo::Client e passado para métodos de operação que devem ser executados no contexto dessa sessão.

Observe que os objetos da sessão não são seguros para threads. Eles só devem ser usados por um thread de cada vez.

Uma sessão pode ser criada chamando o método start_session em um cliente e passando um bloco:

client.start_session do |session|
# work with the session
end

Ao usar o formulário de bloqueio, a sessão será encerrada automaticamente pelo driver após o término da execução do bloqueio.

É válido chamar start_session sem opções definidas. Isso resultará em uma sessão que não tem efeito sobre as operações executadas no contexto dessa sessão, exceto a inclusão de um ID de sessão nos comandos enviados ao servidor. Consulte os documentos da API para todas as opções de sessão suportadas.

Um erro será gerado se o driver estiver conectado a uma implantação que não ofereça suporte a sessões e o método start_session seja chamado.

Observe que as sessões do servidor são descartadas no lado do servidor se não forem usadas por um determinado período. Esteja ciente de que, se o aplicativo chamar #start_session em um cliente e esperar mais de 1 minuto para usar a sessão, ele corre o risco de receber erros devido à sessão ficar obsoleta antes de ser usada.

Um objeto de sessão pode ser passado para a maioria dos métodos de driver para que a operação possa ser executada no contexto dessa sessão. Consulte os documentos da API para saber quais métodos suportam um argumento de sessão.

Crie uma sessão e execute uma inserção e, em seguida, encontre usando essa sessão:

client.start_session do |session|
client[:artists].insert_one({ :name => 'FKA Twigs' }, session: session)
client[:artists].find({ :name => 'FKA Twigs' }, limit: 1, session: session).first
end

Se você quiser chamar métodos em um Mongo::Collection::View no contexto de uma sessão específica, poderá criar o Mongo::Collection::View com a sessão e, em seguida, chamar métodos nela:

client.start_session(causal_consistency: true) do |session|
view = client[:artists].find({ :name => 'FKA Twigs' }, session: session)
view.count # will use the session
end

Você também pode passar a opção de sessão para os métodos diretamente. Esta sessão substituirá qualquer sessão associada ao Mongo::Collection::View :

client.start_session do |session|
client.start_session do |second_session|
view = client[:artists].find({ :name => 'FKA Twigs' }, session: session)
view.count(session: second_session) # will use the second_session
end
end

Uma sessão pode ser criada chamando o método start_session em um cliente:

session = client.start_session

Quando o start_session é utilizado sem passar um bloco para ele, o driver não limpa automaticamente a sessão, o que pode resultar em um acúmulo de sessões no servidor. Use end_session para encerrar manualmente a sessão criada. O servidor limpará automaticamente as sessões antigas após um tempo limite, mas o aplicativo deve encerrar as sessões quando elas não forem mais necessárias.

Gravações não reconhecidas só são permitidas fora do mecanismo de sessão; se uma sessão explícita for fornecida para uma gravação não reconhecida, o driver não enviará a ID da sessão com a operação. Da mesma forma, o driver não usará uma sessão implícita para uma gravação não reconhecida.

Uma sessão causalmente consistente permitirá que você leia suas gravações e garanta leituras crescentes monotonicamente de secundários. Para criar uma sessão causalmente consistente, defina a opção causal_consistency como verdadeira:

session = client.start_session(causal_consistency: true)
# The update message goes to the primary.
collection = client[:artists]
collection.update_one({ '_id' => 1 }, { '$set' => { 'x' => 0 } }, session: session)
# Read your write, even when reading from a secondary!
collection.find({ '_id' => 1 }, session: session).first
# This query returns data at least as new as the previous query,
# even if it chooses a different secondary.
collection.find({ '_id' => 2 }, session: session).first

Como as gravações não reconhecidas não recebem uma resposta do servidor (ou não aguardam uma resposta), o driver não tem como acompanhar onde a gravação não reconhecida está no tempo lógico. Portanto, as leituras causalmente consistentes não são causalmente consistentes com gravações não reconhecidas.

Observe que, se você definir a opção causal_consistency como nil como em (causal_consistency: nil), ela será interpretada como falsa.

Para encerrar uma sessão, chame o método end_session :

session.end_session

Em seguida, o driver Ruby adicionará o ID da sessão do servidor correspondente a um pool para reutilização. Quando um cliente é fechado, o driver envia um comando ao servidor para encerrar todas as sessões armazenadas em cache no pool de sessões do servidor. Você pode ver este comando em seus registros quando um cliente é fechado.

Observe que, ao usar a sintaxe de bloco para start_session , a sessão é automaticamente encerrada após o término da execução do bloco.

← Fluxos de alterações