Docs Menu
Docs Home
/ / /
Ruby MongoDB ドライバー
/

セッション

項目一覧

  • からセッションを作成する Mongo::Client
  • セッションの使用
  • セッションを作成する代替方法
  • 未確認の書込み
  • 因果整合性
  • セッションを終了する

MongoDB サーバーのバージョン 3.6 では、クライアントの論理セッションの概念が導入されています。 セッションは、何らかの方法で関連するアプリケーションによって実行される連続した操作のセットを表す抽象的な概念です。 セッション オブジェクトは Mongo::Client経由で作成され、そのセッションのコンテキストで実行される必要がある操作メソッドに渡されます。

セッション オブジェクトはスレッドセーフではないことに注意してください。 これらは一度に 1 つのスレッドのみで使用する必要があります。

セッションは、クライアントでstart_sessionメソッドを呼び出し、それに ブロックを渡すことで作成できます。

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

ブロック形式を使用する場合、ブロックの実行が完了した後にセッションはドライバーによって自動的に終了されます。

オプションを設定せずにstart_sessionを呼び出すのは有効です。 これにより、サーバーに送信されるコマンドにセッション ID が含まれる場合以外では、そのセッションのコンテキストで実行される操作には影響しないセッションが生成されます。 サポートされているすべてのセッション オプションについては、 API Docsを参照してください。

ドライバーがセッションをサポートしていない配置に接続され、かつstart_sessionメソッドが呼び出されると、エラーがスローされます。

サーバー セッションは一定期間使用されない場合、サーバー側で破棄されることに注意してください。 アプリケーションがクライアントで#start_sessionを呼び出し、セッションの使用に 1 分以上待機すると、セッションが使用される前にセッションが古くなることがあり、エラーが発生するリスクがあることに注意してください。

セッション オブジェクトはほとんどのドライバー メソッドに渡すことができ、そのセッションのコンテキストで操作を実行できます。 どのメソッドがセッション引数をサポートするかについては、 API Docsを 参照してください。

セッションを作成し、挿入を実行し、そのセッションを使用して検索を実行します。

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

特定のセッションのコンテキストでMongo::Collection::Viewでメソッドを呼び出したい場合は、セッションでMongo::Collection::Viewを作成し、そのセッションでメソッドを呼び出します。

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

セッション オプションを直接メソッドに渡すこともできます。 このセッションは、 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

セッションは、クライアントでstart_sessionメソッドを呼び出すことで作成できます。

session = client.start_session

ブロックを渡せずにstart_sessionを使用すると、ドライバーはセッションを自動的にクリーンアップせず、サーバー上にセッションが蓄積される可能性があります。 作成したセッションを手動で終了するには、 end_sessionを使用します。 サーバーはタイムアウト後に古いセッションを自動的にクリーンアップしますが、セッションが不要になったときにアプリケーションはセッションを終了する必要があります。

未確認の書込みは、セッション メカニズムの外部でのみ許可されます。未確認の書込み (write) に対して明示的なセッションが指定された場合、ドライバーは 操作ではセッション ID を送信しません。 同様に、ドライバーは未確認の書き込みには暗黙的なセッションを使用しません。

因果的に整合性のあるセッションにより、書込み操作の結果を読み取ることができ、セカンダリからの単調に増加する読み取りが保証されます。 因果整合性のあるセッションを作成するには、 causal_consistencyオプションを true に設定します。

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

未確認の書込みはサーバーからの応答を受け取らないため(または応答を待たないため)、ドライバーは未確認の書込みが論理時間内のどこを追跡する方法がありません。 Therefore, causally consistent reads are not causally consistent with unacknowledged writes.

(causal_consistency: nil)のように causal_consistency オプションを nil に設定すると、false として解釈されることに注意してください。

セッションを終了するには、 end_sessionメソッドを呼び出します。

session.end_session

その後、Ruby ドライバーは対応するサーバー セッションの ID を再利用するためにプールに追加します。 クライアントが閉じられると、ドライバーはサーバーにコマンドを送信し、サーバー セッション プールにキャッシュされたすべてのセッションを終了します。 クライアントが閉じられたときに、ログにこのコマンドが表示されることがあります。

start_sessionブロック構文を使用している場合、ブロックの実行が完了するとセッションは自動的に終了されることに注意してください。

戻る

変更ストリーム