Docs Menu
Docs Home
/ / /
Java 同期

接続のトラブルシューティング

項目一覧

  • サーバー接続エラー
  • 接続stringの確認
  • ファイアウォールを設定する
  • 接続数の確認
  • 認証エラー
  • 認証情報の形式確認
  • 認証メカニズムを検証する
  • 認証データベースでユーザーがであることを確認
  • DNS 解決エラー
  • データベース配置の可用性を確認
  • ネットワーク アドレスの確認
  • セキュリティ証明書のエラー
  • タイムアウト エラー
  • セット maxConnectionTimeoutMS
  • maxConnectionLifeTimemaxConnectionIdleTimeを設定する
  • サーバー選択タイムアウトの例外
  • その他のエラー
  • スレッド例外の監視
  • 証明書リクエストの例外
  • デバッグのヒント
  • TLS/SSL の冗長ログ

このページでは、MongoDB Java ドライバー を使用して MongoDB 配置に接続する際に発生する可能性のある問題に対する潜在的な解決策を提供します。

注意

このページでは、接続の問題のみを説明します。 MongoDB またはドライバーの使用中にその他の問題が発生した場合は、次のリソースにアクセスしてください。

  • バグの報告、ドライバーへの貢献、およびリソースの検索に関する情報については、 問題とヘルプページを参照してください

  • MongoDB Community フォーラム では、質問、ディスカッション、または一般的なテクニカルサポートが受けられます。

  • Java ドライバーに関するよくある質問への回答については、「よくある質問(FAQ) 」ページを参照してください

サーバーに接続しようとしたときに問題が発生した場合、Java ドライバーはエラー メッセージを返します。 このエラーが次のメッセージのようになった場合、ドライバーが MongoDB 配置に接続できないことを示します。

Error: couldn't connect to server 127.0.0.1:27017

次のセクションでは、問題を解決するのに役立つ可能性のある方法について説明します。

接続stringのホスト名とポート番号が両方とも正確であることを確認してください。 サンプル エラー メッセージでは、ホスト名は 127.0.0.1で、ポートは27017です。 MongoDB Server のインスタンスのデフォルトのポート値は27017ですが、MongoDB を別のポートでリッスンするように構成できます。

レプリカセットに接続するときは、すべてのレプリカセット ホストを 接続stringに含めます。 接続string内の各ホストをカンマで区切ります。 これにより、ホストの 1 つが到達できない場合でも、ドライバは接続を確立できます。

複数のレプリカセット ホストを指定する方法については、 接続ガイド の「レプリカセットへの接続」セクションを参照してください。

MongoDB 配置がファイアウォールの背後でホストされている場合は、MongoDB がリッスンするポートがファイアウォールで開いていることを確認します。 配置がデフォルトのネットワークポートでリッスンする場合は、ファイアウォールでポート27017が開いていることを確認します。 配置が別のポートでリッスンする場合は、ファイアウォールでポートが開いていることを確認します。

警告

MongoDB 配置がリッスンするポートであることが確実な場合を除き、ファイアウォール ポートを開かないでください。

MongoClientインスタンスは、接続プール内で同時にオープンする接続の最大数をサポートします。 この値は構成パラメータmaxPoolSizeによって定義され、デフォルトでは100に設定されます。 オープンな接続の数がmaxPoolSizeと等しい場合、サーバーは接続が利用可能になるまで待機します。 この待機時間がmaxIdleTimeMSの値を超えると、ドライバーはエラーで応答します。

ドライバーで接続プーリングがどのように機能するかについて詳しくは、「 Java ドライバーで接続プーリングがどのように機能するか 」を参照してください。 FAQ に記載されています。

承認が正しく構成されていないと、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");

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オプションは、Java ドライバーがタイムアウトするまで接続を待機する時間を示します。 デフォルト値は10000です。 ドライバーをタイムアウトしないようにするには、この値を増やすか、 0に設定します。

maxConnectionLifeTimemaxConnectionIdleTimeの設定を検討してください。 これらのパラメーターは、ドライバーが 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)をsecondarysecondaryPreferred 、またはnearestに設定すると、接続されたセカンダリ ノードに対して読み取り操作を実行することはできます。

また、 serverSelectionTimeoutMS接続オプションを指定して、ドライバーがサーバーを選択する必要がある時間を調整することもできます。 詳細については、「接続オプション 」ガイドを参照してください。

このセクションでは、広範なカテゴリに該当しない接続エラーを示します。

INFO: Exception in monitor thread while connecting to server ssc-cluster-01-shard-00-02.9cbnp.mongodb.net:27017

このエラーを解決するには、「セキュリティ証明書エラー 」で説明されているように、証明書をインストールする必要があります。

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

この問題の詳細については、 問題の説明 を参照してください OpenJDK バグ システム トグルの問題。

具体的なエラーメッセージには関係ありませんが、このセクションには接続の問題のトラブルシューティングに役立つ情報が含まれています。

-Djavax.net.debug=allシステム プロパティを使用すると、TLS/SSL を使用して確立される接続を含む、すべての接続に関連するデバッグレベルのロギングを有効にできます。

デバッグレベルのログを有効にすると、接続の問題の原因を診断するのに役立ちます。 TLS/SSL ログ メッセージの詳細については、「 SSL/TLS 接続のデバッグ 」を参照してください。 Java のドキュメント。

戻る

FAQ