java MongoSocketReadException:过早到达流的末端(在一段时间的不活动之后)

qjp7pelc  于 2023-04-28  发布在  Java
关注(0)|答案(7)|浏览(85)

我在一段时间的不活动后,在find调用(默认Java驱动程序)时得到此错误。我尝试添加一个手动心跳(写入一个有上限的集合),但没有帮助。我只有在连接到compose上的示例时才会遇到这个问题(i.即不在本地上下文中)。
MongoDB版本是3。2.8、最新驱动程序(3.3)使用Java 8。
你知道吗?

nafvub8i

nafvub8i1#

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

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

看看这是否有帮助。当你连接到mongoDB时,你可以向它传递socket选项。我来自节点背景,我们使用以下选项来保持它的活力。

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

希望这有帮助!!

d8tt03nd

d8tt03nd2#

我通过将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 GCP

pgvzfuti

pgvzfuti3#

我同意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/
希望对你有帮助。

deikduxw

deikduxw4#

这在spring Boot 和基于云的mongo(Atlas集群示例)中适用。

编辑 www.example.com 像这样:

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
hts6caw3

hts6caw35#

对我来说,这是一个完全不同的问题-我正在使用mongo-java-serverFongo,并最终得到这个错误。结果是old versions of it are not compatible with FieldType.DECIMAL128 conversions
更新到最新版本(1.36.0目前)为我解决了这个问题。

ej83mcc0

ej83mcc06#

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

8gsdolmq7#

我走了两步就修好了。

第一个:

准备适当的MongoClientSettings对象,其中包含Mongo客户端的密钥设置。

private MongoClientSettings getMongoClientSettings() {
    return MongoClientSettings.builder()
        .retryWrites(true)
        .applyToConnectionPoolSettings(poolSettings -> poolSettings
                .minSize(5)
                .maxSize(300)
                .maxConnectionIdleTime(0, TimeUnit.MILLISECONDS))
        .applyToSocketSettings(socketSettings -> socketSettings
                .connectTimeout(1, TimeUnit.MINUTES)
                .readTimeout(1, TimeUnit.MINUTES))
        .build();
}
  • maxConnectionIdleTime -连接可以不使用的最长时间。零值表示对空闲时间没有限制。*
  • maxSize -允许的最大连接数。这些连接在空闲时将保留在池中。一旦池耗尽,任何需要连接的操作都将阻止等待可用连接。默认值为100*
  • minSize -最小连接数。这些连接在空闲时将保留在池中,并且池将确保它至少包含这个最小数量。默认值为0*
    第二个:

增加www. example中的默认超时 www.example.com / application.yaml文件(或您已经拥有的文件)

mongodb:
 database: your_db_name
 authDatabase: admin
 config:
   enabled: true
   write:
     writeConcern:
       isMajority: true
     timeout:
       milliseconds: 100000

检查一下,应该能用:)

相关问题