このページでは、MongoDB Java ドライバー を使用して MongoDB 配置に接続する際に発生する可能性のある問題に対する潜在的な解決策を提供します。
注意
このページでは、接続の問題のみを説明します。 MongoDB またはドライバーの使用中にその他の問題が発生した場合は、次のリソースにアクセスしてください。
バグの報告、ドライバーへの貢献、およびリソースの検索に関する情報については、 の問題とヘルプページを参照してください
MongoDB Community フォーラム では、質問、ディスカッション、または一般的なテクニカルサポートが受けられます。
サーバー接続エラー
サーバーに接続しようとしたときに問題が発生した場合、 Javaドライバーはエラー メッセージを返します。このエラーが次のメッセージのような場合、ドライバーはMongoDBデプロイに接続できないことを示します。
Error: couldn't connect to server 127.0.0.1:27017
次のセクションでは、問題を解決するのに役立つ可能性のある方法について説明します。
接続stringの確認
接続stringのホスト名とポート番号が両方とも正確であることを確認してください。 サンプル エラー メッセージでは、ホスト名は 127.0.0.1
で、ポートは27017
です。 MongoDB Server のインスタンスのデフォルトのポート値は27017
ですが、MongoDB を別のポートでリッスンするように構成できます。
レプリカセットに接続するときは、すべてのレプリカセット ホストを 接続stringに含めます。 接続string内の各ホストをカンマで区切ります。 これにより、ホストの 1 つが到達できない場合でも、ドライバは接続を確立できます。
複数のレプリカセット ホストを指定する方法については、 接続ガイド の「レプリカセットへの接続」セクションを参照してください。
ファイアウォールを設定する
MongoDB 配置がファイアウォールの背後でホストされている場合は、MongoDB がリッスンするポートがファイアウォールで開いていることを確認します。 配置がデフォルトのネットワークポートでリッスンする場合は、ファイアウォールでポート27017
が開いていることを確認します。 配置が別のポートでリッスンする場合は、ファイアウォールでポートが開いていることを確認します。
警告
MongoDB 配置がリッスンするポートであることが確実な場合を除き、ファイアウォール ポートを開かないでください。
接続数の確認
各MongoClient
インスタンスは、接続プール内で同時にオープンする接続の最大数をサポートします。 この値は構成パラメータmaxPoolSize
によって定義され、デフォルトでは100
に設定されます。 オープンな接続の数がmaxPoolSize
と等しい場合、サーバーは接続が利用可能になるまで待機します。 この待機時間がmaxIdleTimeMS
の値を超えると、ドライバーはエラーで応答します。
ドライバーで接続プーリングがどのように機能するかについて詳しくは、接続プールのページを参照してください。
認証エラー
承認が正しく構成されていないと、Java ドライバーは MongoDB 配置に接続できない可能性があります。 このような場合、ドライバーは次のようなエラー メッセージを発生させます。
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.
次のセクションでは、問題を解決するのに役立つ可能性のある方法について説明します。
認証情報の形式確認
認証の問題の最も一般的な原因の 1 つは、 MongoDB接続string内の無効な認証情報の形式です。
Tip
接続文字列の使用方法の詳細については、接続ガイドの「接続 URI 」を参照してください。
接続stringにユーザー名とパスワードが含まれている場合は、それらが正しく形式されていることを確認してください。
注意
ユーザー名またはパスワードに次の文字のいずれかが含まれている場合は、パーセント エンコードする必要があります 。
: / ? # [ ] @
接続stringで、パーセント エンコードされたユーザー名とパスワードを使用します。
認証メカニズムを検証する
資格情報と認証メカニズムが正しいことを確認します。 接続stringのオプションで認証資格情報を指定できます。
MongoCredential
を使用してクライアントを構築する場合、ビルダ メソッドは認証メカニズムに対応します。 次のコードは、 SCRAM-SHA-256
認証メカニズムのビルダ メソッドを示しています。
MongoCredential credential = MongoCredential.createScramSha256Credential("<db_username>", "<authenticationDb>", "<dbpassword>");
認証メカニズムの指定の詳細については、認証メカニズムセクションを参照してください。
認証データベースでユーザーがであることを確認
ユーザー名とパスワードベースの認証方法を使用する場合、認証データベースにユーザー名を定義する必要があります。
デフォルトの認証データベースはadmin
データベースです。 認証に別のデータベースを使用するには、 接続stringで authSource
オプションを指定します。
次の例えでは、認証データベースとしてusers
データベースを使用するように MongoDB に指示します。
MongoClient mongoClient = MongoClients.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users");
DNS 解決エラー
Java ドライバーが DNS 接続を解決できない可能性があります。 その場合、次のメッセージのようなエラー メッセージが表示される場合があります。
com.mongodb.MongoSocketWriteException: Exception sending message
ドライバーがこのエラーを報告する場合は、問題を解決するために次のセクションの方法を試してください。
データベース配置の可用性を確認
MongoDB Atlas に接続していて、ドライバーが Atlas データベース配置の DNS ホストを検出できない場合は、データベース配置が一時停止または削除される可能性があります。
データベース配置が Atlas に存在することを確認します。 クラスターが一時停止されている場合は、Atlas UI またはAtlas コマンドラインインターフェイスでクラスターを再開できます。
クラスターを再開する方法については、Atlas ドキュメントの「 1 つのクラスターの再開」を参照してください。
ネットワーク アドレスの確認
接続stringのネットワークアドレスまたはホスト名が正確であることを確認してください。
配置がMongoDB Atlasでホストされている場合は、 「 クラスターへの接続 」チュートリアルに従って、 Atlas接続stringを見つけることができます。
セキュリティ証明書のエラー
Java バージョン8またはそれ以前のバージョンを使用している場合は、信頼ストアに証明書を追加する必要がある場合があります。 証明書を追加する方法については、JDK の新しいバージョンにアップグレードするか、Atlas ドキュメントの「セキュリティ FAQ 」の手順をお読みください。
タイムアウト エラー
ドライバー を介してサーバーにメッセージを送信すると、メッセージの応答に時間がかかることがあります。 その場合、次のいずれかのメッセージのようなエラー メッセージが表示される場合があります。
Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description
これらのエラーが発生した場合は、問題を解決するために次の方法をお試しください。
セット maxConnectionTimeoutMS
maxConnectionTimeoutMS
オプションは、Java ドライバーがタイムアウトするまで接続を待機する時間を示します。 デフォルト値は10000
です。 ドライバーをタイムアウトしないようにするには、この値を増やすか、 0
に設定します。
maxConnectionLifeTime
と を設定するmaxConnectionIdleTime
maxConnectionLifeTime
とmaxConnectionIdleTime
の設定を検討してください。 これらのパラメーターは、ドライバーが MongoDB インスタンスへの接続を維持する期間を構成します。 これらのパラメーターの詳細については、「接続プールの設定 」を参照してください。
サーバー選択タイムアウトの例外
一部のサーバーが利用可能な場合でもアプリケーションはリクエストを完了できず、ドライバーはサーバー選択タイムアウトの例外を返すことがあります。
この例外は タイプMongoTimeoutException
です。 次は、プライマリに到達できないレプリカセットに リクエストを送信しようとした場合に発生する例外のサンプルを示しています。
com.mongodb.MongoTimeoutException: Timed out while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=REPLICA_SET, servers=[ {address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}, {address=localhost:27018, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}, {address=localhost:27019, type=REPLICA_SET_SECONDARY, roundTripTime=15.0 ms, state=CONNECTED} ] }
エラーには、各ノードの接続状態を記述するクラスター状態のビューが含まれます。これにより、接続問題の原因を特定するのに役立ちます。
前述のエラーでは、接続されているサーバーのみを接続するサーバーlocalhost:27019
はセカンダリ ノードです。 このため、ドライバーはprimary
の読み込み設定(read preference)を満たすサーバーを選択できないため、リクエストはタイムアウトします。 この状況でも、読み込み設定(read preference)をsecondary
、 secondaryPreferred
、またはnearest
に設定すると、接続されたセカンダリ ノードに対して読み取り操作を実行することはできます。
また、 serverSelectionTimeoutMS
接続オプションを指定して、ドライバーがサーバーを選択する必要がある時間を調整することもできます。詳しくは、クラスター設定ガイドを参照してください。
その他のエラー
このセクションでは、広範なカテゴリに該当しない接続エラーを示します。
スレッド例外の監視
INFO: Exception in monitor thread while connecting to server ssc-cluster-01-shard-00-02.9cbnp.mongodb.net:27017
このログ行は、各レプリカセットノードまたは mongos
サーバーのステータスを継続的に確認するモニターが、ノードまたはサーバーのいずれかに接続できなかったことを示しています。これはサーバーのメンテナンス操作中に予想されるメッセージであり、無視しても問題ありません。
証明書リクエストの例外
javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
これは、特定のバージョンの JDK における既知の問題で、TLS 1.3プロトコルを使用して接続しようとすると発生する可能性があります。
MongoDB インスタンスまたはクラスターに接続するときにこのエラーが発生した場合は、JDK を次のいずれかのパッチ バージョンに更新してください。
JDK 11.0.7
JDK 13.0.3
JDK 14.0.2
デバッグのヒント
具体的なエラーメッセージには関係ありませんが、このセクションには接続の問題のトラブルシューティングに役立つ情報が含まれています。
TLS/SSL の冗長ログ
-Djavax.net.debug=all
システム プロパティを使用すると、TLS/SSL を使用して確立される接続を含む、すべての接続に関連するデバッグレベルのロギングを有効にできます。
デバッグレベルのログを有効にすると、接続の問題の原因を診断するのに役立ちます。 TLS/SSL ログ メッセージの詳細については、「 SSL/TLS 接続のデバッグ 」を参照してください。 Java のドキュメント。