このエラーは、find
呼び出し(デフォルトJava Driver)の非アクティブ期間後に発生します。手動のハートビート(上限付きコレクションへの書き込み)を追加しようとしましたが、作成時にインスタンスに接続しているときにのみ問題が発生します(つまり、ローカルコンテキストではありません)。
MongoDBバージョンは3.2.8、最新ドライバー(3.3)、Java 8。
何か案が ?
私はここでのRhaangaunの答えに同意します、Javaのコードでの私の選択です:
public static DB getMongoDB() {
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
//build the connection options
builder.maxConnectionIdleTime(60000);//set the max wait time in (ms)
MongoClientOptions opts = builder.build();
char[] password2 = "mypassword".toCharArray();
MongoCredential credential2 = MongoCredential.createCredential("username", "databasename",password2);
//add your option to the connection
MongoClient mongoClient = new MongoClient(new ServerAddress("server ip",27017), Arrays.asList(credential2),opts);
//use your database
cachedDb = mongoClient.getDB("databasename");
return cachedDb;
}
ここに私の研究リンクがあります: http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/
お役に立てば幸いです。
私はいくつかのドキュメントでそれを見つけました:
長時間実行されるアプリケーションでは、多くの場合、ミリ秒単位で「keepAlive」を有効にすることが賢明です。それなしでは、しばらくすると、理由がないと思われる「接続が閉じられました」というエラーが表示されるようになります。
これが役立つかどうかを確認してください。 mongoDBに接続すると、ソケットオプションを渡すことができます。私はノードのバックグラウンドから来ており、次のオプションを使用してそれを維持します。
server: {
socketOptions: {
keepAlive: 100,
connectTimeoutMS: 30000
}
}
お役に立てれば!!
SslEnabledをtrueに設定してこの問題を解決します。サンプルコード:
@Bean
public MongoClient mongoClient() {
List<ServerAddress> saList = new ArrayList<>();
saList.add(new ServerAddress("cluster0-shard-00-00-75shm.gcp.mongodb.net", 27017));
saList.add(new ServerAddress("cluster0-shard-00-01-75shm.gcp.mongodb.net", 27017));
saList.add(new ServerAddress("cluster0-shard-00-02-75shm.gcp.mongodb.net", 27017));
char[] pwd = "password".toCharArray();
MongoCredential credential = MongoCredential.createCredential("username", "admin", pwd);
//set sslEnabled to true here
MongoClientOptions options = MongoClientOptions.builder()
.readPreference(ReadPreference.primaryPreferred())
.retryWrites(true)
.requiredReplicaSetName("Cluster0-shard-0")
.maxConnectionIdleTime(6000)
.sslEnabled(true)
.build();
MongoClient mongoClient = new MongoClient(saList, credential, options);
return mongoClient;
}
追加:クライアントjarはorg.mongodb.mongodb-driver 3.6.4、サーバーはGCP上のmongodb atlas M0 3.6.6です
Application.propertiesを次のように編集します。
spring.data.mongodb.uri = mongodb+srv://username:[email protected]/dbname
通常のmongoインスタンス(非クラスター化)の場合:
spring.data.mongodb.uri = mongodb://username:[email protected]:27017,hostname2:27017/dbname?ssl=true