MongoSocketReadException:过早到达流的末尾(一段时间不活动后)
MongoSocketReadException: Prematurely reached end of stream (after a period of inactivity)
我在 find
调用(默认 Java 驱动程序)一段时间不活动后收到此错误。我试图添加一个手动心跳(写入一个上限集合),但它没有帮助。我只在连接到撰写时的实例时遇到问题(即不在本地上下文中)。
MongoDB版本为3.2.8,最新驱动(3.3),使用Java8.
有什么想法吗?
我在一些文档中找到它:
对于较长的 运行 应用程序,启用 "keepAlive" 毫秒数通常是明智的。没有它,一段时间后您可能会开始看到 "connection closed" 错误,这似乎是无缘无故的。
看看这是否有帮助。当您连接到 mongoDB 时,您可以将套接字选项传递给它。我来自节点背景,我们使用以下选项来保持它的活力。
server: {
socketOptions: {
keepAlive: 100,
connectTimeoutMS: 30000
}
}
希望对您有所帮助!!
我同意 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;
}
这是我的研究link:http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/
希望对你有帮助。
我通过设置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,服务器是 mongodb GCP 上的 atlas M0 3.6.6
这在 spring 引导和基于云的 mongo(Atlas 集群实例)中对我有用。
像这样编辑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
- 如果你想设置其他连接选项,你可以链接
使用 '&' 的多个参数;文档在这里:
https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html
- 如果您使用其他 spring.data.mongodb 参数,您应该
全部删除否则spring无法读取
spring.data.mongodb.uri
对我来说这是一个完全不同的问题 - 我使用的是 mongo-java-server with Fongo and ended up getting this error. Turns out that old versions of it are not compatible with FieldType.DECIMAL128
conversions.
更新到最新版本(目前为 1.36.0)为我解决了这个问题。
问题是 Mongodb 结束了连接。您需要增加 Mongodb 驱动程序的超时时间,这里是一个示例代码。
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");
我在 find
调用(默认 Java 驱动程序)一段时间不活动后收到此错误。我试图添加一个手动心跳(写入一个上限集合),但它没有帮助。我只在连接到撰写时的实例时遇到问题(即不在本地上下文中)。
MongoDB版本为3.2.8,最新驱动(3.3),使用Java8.
有什么想法吗?
我在一些文档中找到它:
对于较长的 运行 应用程序,启用 "keepAlive" 毫秒数通常是明智的。没有它,一段时间后您可能会开始看到 "connection closed" 错误,这似乎是无缘无故的。
看看这是否有帮助。当您连接到 mongoDB 时,您可以将套接字选项传递给它。我来自节点背景,我们使用以下选项来保持它的活力。
server: {
socketOptions: {
keepAlive: 100,
connectTimeoutMS: 30000
}
}
希望对您有所帮助!!
我同意 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;
}
这是我的研究link:http://3t.io/blog/how-to-prevent-your-connection-from-dropping-with-hosted-mongodb-instances/
希望对你有帮助。
我通过设置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,服务器是 mongodb GCP 上的 atlas M0 3.6.6
这在 spring 引导和基于云的 mongo(Atlas 集群实例)中对我有用。
像这样编辑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
- 如果你想设置其他连接选项,你可以链接 使用 '&' 的多个参数;文档在这里: https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html
- 如果您使用其他 spring.data.mongodb 参数,您应该 全部删除否则spring无法读取 spring.data.mongodb.uri
对我来说这是一个完全不同的问题 - 我使用的是 mongo-java-server with Fongo and ended up getting this error. Turns out that old versions of it are not compatible with FieldType.DECIMAL128
conversions.
更新到最新版本(目前为 1.36.0)为我解决了这个问题。
问题是 Mongodb 结束了连接。您需要增加 Mongodb 驱动程序的超时时间,这里是一个示例代码。
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");