FAQ
項目一覧
このページでは、よくある質問とその回答を見つけることができます。
Tip
このページで質問に対する回答が見つからない場合は、問題を報告する方法についてはの問題とヘルプページを参照してください。
MongoDB インスタンスへの接続に問題があるのはなぜですか?
MongoDB 配置への接続に問題がある場合は、考えられる解決策について接続トラブルシューティング ガイドを参照してください。
Kotlin ドライバーと KMongo の違いは何ですか?
Kotlin ドライバーは、 Kotlin の公式 MongoDB ドライバーです。 これは MongoDB チームによって開発され、 Kotlin アプリケーションが MongoDB に接続してデータを操作するためのネイティブ API を提供します。 これは MongoDB Java ドライバーをラップすることで実装されています。
KMongo は、 Kotlin アプリケーションから MongoDB を操作するための一般的なコミュニティ開発ライブラリです。これは、公式の Kotlin ドライバーの作成より前に作成された Java ドライバーを囲み、 Kotlin コミュニティのニーズに対応するためのラッパーです。
重要
2023 年 7 月現在、KMongo は非推奨としてマークされています。
Kotlin ドライバーは、KMongo の作成者である MongoDB Atlas と連携して開発され、ユーザーは公式にサポートされているドライバーを提供できます。
公式の Kotlin ドライバーと KMongo の API はほぼ同様です。 Kotlin ドライバーと KMongo 間の注目すべき類似性は次のとおりです。
同期操作とコルーチンベースの操作のサポート
データ クラスを使用した MongoDB ドキュメントの表現をサポートする
KotlinX 直列化のサポート
MongoDB CRUD API と集計のサポート
公式の Kotlin ドライバーと KMongo は似ていますが、いくつか重要な違いがあります。
公式ドライバーには プロセスでの 組み込み サポートはありませ ん2 、 rxjava 、 ジャーナリング 、または GSON 。
公式ドライバーは MongoDB shell コマンドをサポートしていません。
公式ドライバーは Builders API による型セーフなクエリをサポートしていますが、KMongo は型セーフなクエリにインデックス関数とプロパティ参照を使用します。
詳細については、「 KMongo からの移行 」を参照してください。
Kotlin ドライバーと Kotlin SDK の違いは何ですか。
MongoDB は、 Kotlin でのモバイルとサーバーサイドの両方の開発をサポートしています。 Android または Kotlin マルチプラットフォーム(Kmp)用のモバイル アプリケーションを開発している場合は、 MongoDB Atlas Device Kotlin SDKを使用して Atlas App Services にアクセスし、Realm データを管理できます。
Kotlin ドライバーは、慣用的な Kotlin アプリケーションを構築するための完全なライブラリを提供することで、サーバーサイドでの開発をサポートします。 Kotlin コルーチン ドライバーのこのドキュメントでは、非同期アプリケーションを開発する方法を学習できます。または、同期プログラミングの詳細については、 Kotlin Sync ドライバーのドキュメントを表示します。
Kotlin ドライバーでの接続プーリングの仕組み
すべての MongoClient
インスタンスには、MongoDB トポロジー内の各サーバーに対する接続プールが組み込まれています。 接続プールはオンデマンドでソケットを開き、マルチスレッド アプリケーションで同時 MongoDB 操作をサポートします。
各接続プールの最大サイズはmaxPoolSize
オプションによって設定され、デフォルトは100
になります。 サーバーへの使用中の接続数がmaxPoolSize
の値に達した場合、そのサーバーへの次のリクエストは、接続が利用可能になるまで待機します。
各MongoClient
インスタンスは、サーバーの状態を監視するために MongoDB トポロジー内のサーバーごとに 2 つの追加のソケットを開きます。
たとえば、3 ノードのレプリカセットに接続されたクライアントは 6 個の監視ソケットを開きます。 また、各サーバー上でアプリケーションのスレッドをサポートするために必要な数のソケットを開きます(上限はmaxPoolSize
の値まで)。 maxPoolSize
が100
で、アプリケーションがプライマリ(デフォルト)のみを使用している場合、プライマリ接続プールのみが増加し、合計接続数は最大106
になります。 アプリケーションが 読み込み設定( read preference ) を使用してセカンダリ ノードをクエリする場合、それらのプールも大きくなり、合計接続数が306
になる可能性があります。
さらに、接続プールにはレート制限があり、各接続プールは一度に最大でmaxConnecting
の接続のみを並列に作成できます。 次の場合、追加のスレッドは待機を停止します。
既存のスレッドの 1 つが接続の作成を完了するか、既存の接続がプールにチェックバックされます。
接続作成のレート制限により、既存の接続を再利用するドライバーの能力が向上します。
minPoolSize
オプションを使用して、各サーバーへの同時接続の最小数を設定できます。デフォルトは0
になります。 接続プールはこのソケット数で初期化されます。 ネットワークエラーによってソケットが閉じられ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回る場合、最小値に達するまでさらにソケットが開かれます。
接続が削除され、 maxIdleTimeMS
オプションに置き換えられる前に、プール内でアイドル状態を維持できる最大数を設定できます。この値のデフォルトは0
(制限なし)です。
MongoClient
の次のデフォルト構成はほとんどのアプリケーションで動作します。
val client = MongoClient("<connection string>")
クライアントはプロセスごとに 1 回作成し、すべての操作で再利用します。 リクエストごとに新しいクライアントを作成することがよくあり、非常に非効率的です。
1 つのプロセス内で多数の同時 MongoDB 操作をサポートするには、 maxPoolSize
を増やすことができます。 プールが最大サイズに達すると、追加のスレッドはソケットが使用可能になるまで待機します。
ドライバーはソケットが利用可能になるまで待機できるスレッド数を制限しません。負荷が急増したときにプールのサイズを境界のあるキューに制限するのはアプリケーションの責任です。 スレッドはwaitQueueTimeoutMS
オプションで指定された時間だけ待機します。デフォルトは120000
(120 秒)です。
ソケットを取得するためにwaitQueueTimeoutMS
で定義された時間以上待機するスレッドは、接続エラーを発生させます。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。
MongoClient.close()
が任意のスレッドによって呼び出されると、ドライバーはすべてのアイドル ソケットを閉じ、プールに返されるときに使用中のすべてのソケットを閉じます。
MongoDB への接続の詳細については、「接続ガイド」を参照してください。