find
在一段时间不活动后,我在调用(默认 Java 驱动程序)时收到此错误。我尝试添加手动心跳(写入上限集合),但没有帮助。我只有在连接到 compose 上的实例时才会遇到问题(即不在本地上下文中)。
MongoDB版本是3.2.8,最新驱动(3.3),使用Java 8。
任何想法 ?
find
在一段时间不活动后,我在调用(默认 Java 驱动程序)时收到此错误。我尝试添加手动心跳(写入上限集合),但没有帮助。我只有在连接到 compose 上的实例时才会遇到问题(即不在本地上下文中)。
MongoDB版本是3.2.8,最新驱动(3.3),使用Java 8。
任何想法 ?
我在一些文档中找到了它:
对于长时间运行的应用程序,通常谨慎的做法是在几毫秒内启用“keepAlive”。没有它,一段时间后您可能会开始看到“连接关闭”错误,这似乎是没有原因的。
检查这是否有帮助。当您连接到 mongoDB 时,您可以将套接字选项传递给它。我来自节点背景,我们使用以下选项来保持它的活力。
server: {
socketOptions: {
keepAlive: 100,
connectTimeoutMS: 30000
}
}
希望这可以帮助!!
我通过设置 sslEnabled 为 true 来解决这个问题,代码示例:</p>
@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:password@solarsystem-1tpu0.mongodb.net/dbname
对于常规 mongo 实例(非集群),请使用:
spring.data.mongodb.uri = mongodb://username:password@solarsystem-shard-00-00-1tpu0.mongodb.net:27017,hostname2:27017/dbname?ssl=true
我同意 Rhangaun 的回答,这是我对 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/
希望它可以帮助你。
问题是MongoDB结束了连接。您需要增加 Mongodb Driver 的超时时间,这里是一个示例代码。
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
//build the connection options
builder.maxConnectionIdleTime(86400000);//set the max wait time in (ms)
MongoClientOptions opts = builder.build();
final Morphia morphia = new Morphia();
morphia.mapPackage("com.java.code");
final String hostURL = "host_url";
MongoCredential credential = MongoCredential.createCredential("username","database","Password".toCharArray());
ServerAddress address = new ServerAddress(hostURL);
List<MongoCredential> credentialList = new ArrayList<>();
credentialList.add(credential);
final MongoClient client = new MongoClient(address,credentialList,opts);
// create the Datastore connecting to the default port on the local host
datastore = morphia.createDatastore(client,"datastore");
对我来说,这是一个完全不同的问题——我将mongo-java-server与Fongo一起使用,最终得到了这个错误。原来它的旧版本与FieldType.DECIMAL128
转换不兼容。
将其更新到最新版本(目前为 1.36.0)为我解决了这个问题。