Overview
このガイドでは、 Rustドライバーのパフォーマンスを最適化する方法を学習できます。 MongoDBに接続するには、Clientインスタンスを作成する必要があります。 Clientインスタンスは、サーバートポロジーの検出や接続のモニタリングなど、接続のほとんどの要素を自動的に処理します。このガイドでは、Clientインスタンスの構成と使用に関するベストプラクティスについて説明します。
このガイドには、次のセクションが含まれています。
クライアントのライフサイクル
クライアントは複数のセッションやオペレーションで再利用することをお勧めします。 同じClientインスタンスを使用して複数のタスクを実行できます。 Client型は複数のスレッドで安全に同時使用できます。 リクエストごとに新しいClientインスタンスを作成すると、パフォーマンスが低下します。
次のコードでは、既存のClientインスタンスへのポインターを受け入れるメソッドが作成されます。これにより、同じクライアントを使用して多くのリクエストを実行できます。
// ... Create a client earlier in your code async fn make_request(client: &Client) -> Result<(), Box<dyn Error>> { // Use the client to perform operations Ok(()) }
並列処理
非同期の同時実行タスクを実行中並列データ操作を実行することで、パフォーマンスを最適化できます。次の例では、tokio::task モジュールの spawn() メソッドを使用して、挿入操作を実行するための個別の同時実行タスクを作成します。
let client = Client::with_uri_str("<connection string>").await?; let data = doc! { "title": "1984", "author": "George Orwell" }; for i in 0..5 { let client_ref = client.clone(); let data_ref = data.clone(); task::spawn(async move { let collection = client_ref .database("items") .collection::<Document>(&format!("coll{}", i)); collection.insert_one(data_ref).await }); }
ランタイム
Clientインスタンスは、それを作成したtokioまたはasync-stdランタイムのインスタンスにバインドされます。 Clientインスタンスを使用して別のランタイムで操作を実行すると、予期しない動作や失敗が発生する可能性があります。
tokio または async_std の testヘルパーcrateを使用してアプリケーションをテストすると、Clientインスタンスに期待されるものとは異なるランタイムで操作が意図せず実行される可能性があります。これは、これらのヘルパーマイクロがテストごとに新しいランタイムを作成するために発生します。この問題を回避するには、次のいずれかの戦略を使用できます。
testヘルパー マイクロを使用せずに、ランタイムをClientインスタンスにアタッチします。asyncテストごとに新しいClientインスタンスを作成します。
次の例では、テスト用にグローバル ランタイムを Clientインスタンスにアタッチします。 test_list_dbs() メソッドは、このランタイムに接続するクライアントを使用して、配置内のデータベースを一覧表示します。
use tokio::runtime::Runtime; use once_cell::sync::Lazy; static CLIENT_RUNTIME: Lazy<(Client, Runtime)> = Lazy::new(|| { let rt = Runtime::new().unwrap(); let client = rt.block_on(async { Client::with_uri_str("<connection string>").await.unwrap() }); (client, rt) }); fn test_list_dbs() -> Result<(), Box<dyn Error>> { let (client, rt) = &*CLIENT_RUNTIME; rt.block_on(async { client.list_database_names().await })?; Ok(()) }
次の例では、 tokio::test を使用して実行されるテストごとに新しい Clientインスタンスを作成し、ランタイム間で意図しないインタラクションが存在しないようにします。
async fn test_list_dbs() -> Result<(), Box<dyn Error>> { let client = Client::with_uri_str("<connection string>").await?; client.list_database_names().await?; Ok(()) }
詳細情報
MongoDBへの接続の詳細については、「 MongoDBクライアントの作成 」ガイドを参照してください。
Rustドライバーで利用可能なランタイムの詳細については、「 非同期 API と同期 API のガイド 」を参照してください。
接続プールを使用してパフォーマンスを最適化する方法については、「 接続プールによる接続の管理 」ガイドを参照してください。
API ドキュメント
モジュールの spawn()
tokio::tasktokio::runtime module