【问题标题】:MongoSocketReadException: Prematurely reached end of stream (after a period of inactivity)MongoSocketReadException:过早到达流的末尾(在一段时间不活动之后)
【发布时间】:2016-12-29 00:36:15
【问题描述】:

在一段时间不活动后,我在 find 调用(默认 Java 驱动程序)上收到此错误。我尝试添加手动心跳(写入上限集合),但没有帮助。我只有在连接到 compose 上的实例时才会遇到问题(即不在本地上下文中)。

MongoDB版本是3.2.8,最新驱动(3.3),使用Java 8。

有什么想法吗?

【问题讨论】:

  • 我发现MongoClientOptionsisSocketKeepAlive标志默认是false,我把它改成了true,我现在等着看我是否再次收到错误。
  • 不幸的是,使用 .socketKeepAlive(true),我们也得到这个错误,我的驱动器版本是 3.0.4
  • 你终于找到原因了吗?我现在面临这个错误
  • 你能检查一下你有多少连接可用吗?从 mongo shell 运行:db.serverStatus().connections { "current" : 204, "available" : 0, "totalCreated" : NumberLong(931) }

标签: java mongodb mongodb-java compose-db


【解决方案1】:

我在一些文档中找到了它:

对于长时间运行的应用程序,通常谨慎的做法是在几毫秒内启用“keepAlive”。如果没有它,一段时间后您可能会开始看到“连接关闭”错误,这似乎是没有原因的。

检查这是否有帮助。当您连接到 mongoDB 时,您可以将套接字选项传递给它。我来自节点背景,我们使用以下选项使其保持活力。

server: {
        socketOptions: {
            keepAlive: 100,
            connectTimeoutMS: 30000
        }
    }

希望这会有所帮助!

【讨论】:

【解决方案2】:

我同意 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/

希望对你有帮助。

【讨论】:

  • 我使用这个构造函数来建立连接,但总是得到异常: MongoClient mongoClient = new MongoClient(new ServerAddress("203.11.83.230",27017), Arrays.asList(credential2)) 我改成了differnet MongoClientOptions 对我来说一切正常
【解决方案3】:

我通过设置 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 atlas M0 3.6.6 on GCP

【讨论】:

  • 如果您的 SSL 已启用,那么证书在哪里?以及上面这段代码中相同的代码在哪里。
【解决方案4】:

这在 Spring Boot 和基于云的 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

【讨论】:

    【解决方案5】:

    对我来说,这是一个完全不同的问题 - 我使用 mongo-java-serverFongo 并最终收到此错误。原来是old versions of it are not compatible with FieldType.DECIMAL128 conversions

    将其更新到最新版本(当前为 1.36.0)为我解决了这个问题。

    【讨论】:

      【解决方案6】:

      问题是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");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 2018-08-05
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        相关资源
        最近更新 更多