Java MongoDB随机异常
我们在IBM云上通过反应式MongoDB驱动程序v1.11使用MongoDB v4.2。 我们目前随机遇到以下异常,通常是在应用程序不活动一段时间之后: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
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毫秒后,打开的连接将关闭,并且当服务收到新请求时,将打开一个新连接
日志样本:
打开连接[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毫秒后,打开的连接将关闭,并且当服务收到新请求时,将打开一个新连接
日志样本:
已打开到主机27017的连接[connectionId{localValue:4}],您是否能够解决此间歇性问题?我在连接MongodBW时遇到类似的异常,您是否能够解决此间歇性问题?我在连接MongoDB时遇到了类似的异常