28

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

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

任何想法 ?

4

6 回答 6

25

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

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

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

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

希望这可以帮助!!

于 2016-09-07T12:14:30.913 回答
7

我通过设置 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

于 2018-07-25T07:12:25.227 回答
6

这在 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
于 2019-01-14T02:33:47.330 回答
5

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

希望它可以帮助你。

于 2016-09-16T05:16:22.573 回答
0

问题是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");
于 2020-11-02T20:59:32.613 回答
0

对我来说,这是一个完全不同的问题——我将mongo-java-serverFongo一起使用,最终得到了这个错误。原来它的旧版本与FieldType.DECIMAL128转换不兼容。

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

于 2020-10-13T18:07:10.757 回答