Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB随机异常_Java_Mongodb_Mongo Java_Mongo Java Driver - Fatal编程技术网

Java MongoDB随机异常

Java MongoDB随机异常,java,mongodb,mongo-java,mongo-java-driver,Java,Mongodb,Mongo Java,Mongo Java Driver,我们在IBM云上通过反应式MongoDB驱动程序v1.11使用MongoDB v4.2。 我们目前随机遇到以下异常,通常是在应用程序不活动一段时间之后: com.mongodb.MongoSocketWriteException: Exception sending message at com.mongodb.internal.connection.InternalStreamConnection.translateWriteException(InternalStreamConnec

我们在IBM云上通过反应式MongoDB驱动程序v1.11使用MongoDB v4.2。 我们目前随机遇到以下异常,通常是在应用程序不活动一段时间之后:

com.mongodb.MongoSocketWriteException: Exception sending message
    at com.mongodb.internal.connection.InternalStreamConnection.translateWriteException(InternalStreamConnection.java:541)
    at com.mongodb.internal.connection.InternalStreamConnection.access$1100(InternalStreamConnection.java:74)
    at com.mongodb.internal.connection.InternalStreamConnection$3.failed(InternalStreamConnection.java:470)
    at com.mongodb.internal.connection.AsynchronousChannelStream$1.failed(AsynchronousChannelStream.java:97)
    at com.mongodb.internal.connection.AsynchronousChannelStream$2.failed(AsynchronousChannelStream.java:173)
    at com.mongodb.internal.connection.AsynchronousChannelStream$AsyncWritableByteChannelAdapter$WriteCompletionHandler.failed(AsynchronousChannelStream.java:198)
    at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannel$10$1.run(AsynchronousTlsChannel.java:269)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Connection reset by peer
    at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
    at sun.nio.ch.IOUtil.write(IOUtil.java:65)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
    at com.mongodb.internal.connection.tlschannel.impl.TlsChannelImpl.writeToChannel(TlsChannelImpl.java:479)
    at com.mongodb.internal.connection.tlschannel.impl.TlsChannelImpl.writeToChannel(TlsChannelImpl.java:464)
    at com.mongodb.internal.connection.tlschannel.impl.TlsChannelImpl.wrapAndWrite(TlsChannelImpl.java:403)
    at com.mongodb.internal.connection.tlschannel.impl.TlsChannelImpl.write(TlsChannelImpl.java:391)
    at com.mongodb.internal.connection.tlschannel.ClientTlsChannel.write(ClientTlsChannel.java:181)
    at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannelGroup.writeHandlingTasks(AsynchronousTlsChannelGroup.java:553)
    at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannelGroup.doWrite(AsynchronousTlsChannelGroup.java:501)
    at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannelGroup.access$400(AsynchronousTlsChannelGroup.java:67)
    at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannelGroup$6.run(AsynchronousTlsChannelGroup.java:459)
    ... 3 more
根据我所读的内容和JavaDoc为驱动程序提供的内容,
keepAlive
参数默认设置为
true
。 但为了安全起见,我们正在明确设置:

MongoClientSettings settings = MongoClientSettings.builder()
    .applyConnectionString(new ConnectionString("xxx")))
    .applyToSocketSettings(builder -> builder.keepAlive(true))
    .build();
MongoClient client = MongoClients.create(settings);
但这似乎并不能解决问题。 它是随机发生的,很少发生。
非常感谢您的帮助

设置Maxidletimes是这里的关键

如果您使用的是AbstractMongoClient配置,请使用以下代码设置MongoClient设置上的MaxIdleTimes

SSLContext.setDefault(sslContext);
String connectionTemplateString = "mongodb://%s:%s@%s/%s?maxIdleTimeMS=%s";
String clusterEndpoint = dbHost + ":" + port;
String maxIdleTimeInMs = "x";
String connectionString = String.format(connectionTemplateString, dbUser, dbPassword, clusterEndpoint,dbName, maxIdleTimeInMs);
ConnectionString connString = new ConnectionString(connectionString);
mongoClientSettings = MongoClientSettings.builder().applyConnectionString(connString)
                    .applyToSslSettings(builder -> {
                        builder.enabled(true);
                        builder.invalidHostNameAllowed(true);
                        builder.context(sslContext);
                    }).build();
如果您正在使用现在的MongoConfiguration,请使用以下代码在MongoClient上设置maxConnectionIdleTime

mongoClientOptions.maxConnectionIdleTime(x);
这些更改将确保在您设置的x毫秒后,打开的连接将关闭,并且当服务收到新请求时,将打开一个新连接

日志样本:

  • x毫秒后
  • 已关闭到主机27017的[connectionId{localValue:3}]连接,因为它已超过允许的最大空闲时间

  • 当一个新的请求进来时

  • 打开连接[connectionId{localValue:4}]到主机:27017

    设置Maxidletimes是这里的关键

    如果您使用的是AbstractMongoClient配置,请使用以下代码设置MongoClient设置上的MaxIdleTimes

    SSLContext.setDefault(sslContext);
    String connectionTemplateString = "mongodb://%s:%s@%s/%s?maxIdleTimeMS=%s";
    String clusterEndpoint = dbHost + ":" + port;
    String maxIdleTimeInMs = "x";
    String connectionString = String.format(connectionTemplateString, dbUser, dbPassword, clusterEndpoint,dbName, maxIdleTimeInMs);
    ConnectionString connString = new ConnectionString(connectionString);
    mongoClientSettings = MongoClientSettings.builder().applyConnectionString(connString)
                        .applyToSslSettings(builder -> {
                            builder.enabled(true);
                            builder.invalidHostNameAllowed(true);
                            builder.context(sslContext);
                        }).build();
    
    如果您正在使用现在的MongoConfiguration,请使用以下代码在MongoClient上设置maxConnectionIdleTime

    mongoClientOptions.maxConnectionIdleTime(x);
    
    这些更改将确保在您设置的x毫秒后,打开的连接将关闭,并且当服务收到新请求时,将打开一个新连接

    日志样本:

  • x毫秒后
  • 已关闭到主机27017的[connectionId{localValue:3}]连接,因为它已超过允许的最大空闲时间

  • 当一个新的请求进来时

  • 已打开到主机27017的连接[connectionId{localValue:4}],您是否能够解决此间歇性问题?我在连接MongodBW时遇到类似的异常,您是否能够解决此间歇性问题?我在连接MongoDB时遇到了类似的异常