【问题标题】:mongodb spring connection lost overnightmongodb spring 连接一夜之间丢失
【发布时间】:2017-12-06 08:56:10
【问题描述】:

我正在使用带有 mongoAPI 的 azure cosmosdb(spring 数据,mongoRepository) 每天早上,第一个从 mongo 获取数据的请求都会导致异常:

以下请求成功,无需执行任何操作。

知道是什么原因造成的吗? 有没有办法让spring自动恢复连接而不会失败请求?

谢谢

例外:

org.springframework.data.mongodb.UncategorizedMongoDbException: Exception sending message; nested exception is com.mongodb.MongoSocketWriteException: Exception sending message
        at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:107)
        at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2135)
        at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1978)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1784)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1767)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:641)
        at org.springframework.data.mongodb.repository.query.MongoQueryExecution$CollectionExecution.execute(MongoQueryExecution.java:79)
        at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingExecution.execute(MongoQueryExecution.java:411)
        at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:94)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
...
Caused by: com.mongodb.MongoSocketWriteException: Exception sending message
        at com.mongodb.connection.InternalStreamConnection.translateWriteException(InternalStreamConnection.java:465)
        at com.mongodb.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:208)
        at com.mongodb.connection.UsageTrackingInternalConnection.sendMessage(UsageTrackingInternalConnection.java:90)
        at com.mongodb.connection.DefaultConnectionPool$PooledConnection.sendMessage(DefaultConnectionPool.java:429)
        at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:189)
        at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:111)
        at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:168)
        at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:289)
        at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:176)
        at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:216)
        at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:207)
        at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:113)
        at com.mongodb.operation.FindOperation$1.call(FindOperation.java:516)
        at com.mongodb.operation.FindOperation$1.call(FindOperation.java:510)
        at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:431)
        at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:404)
        at com.mongodb.operation.FindOperation.execute(FindOperation.java:510)
        at com.mongodb.operation.FindOperation.execute(FindOperation.java:81)
        at com.mongodb.Mongo.execute(Mongo.java:836)
        at com.mongodb.Mongo$2.execute(Mongo.java:823)
        at com.mongodb.DBCursor.initializeCursor(DBCursor.java:870)
        at com.mongodb.DBCursor.hasNext(DBCursor.java:142)
        at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1964)
        ... 129 common frames omitted
Caused by: java.net.SocketException: Broken pipe (Write failed)
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
        at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
        at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
        at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:886)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:857)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
        at com.mongodb.connection.SocketStream.write(SocketStream.java:75)
        at com.mongodb.connection.InternalStreamConnection.sendMessage(InternalStreamConnection.java:204)
        ... 150 common frames omitted

【问题讨论】:

  • 你试过设置keep-alive吗?
  • 我正在使用带有spring.data.mongodb属性的spring boot属性文件连接到mongo。*你知道如何配置keepalive吗?谢谢
  • 我不认为你可以从属性文件中做到这一点
  • 同样的问题

标签: mongodb azure spring-data-jpa azure-cosmosdb


【解决方案1】:

因为超过最大连接空闲时间而关闭连接。

您需要根据自己的要求设置此属性。

maxConnectionIdleTime

这可以在您的 Mongo 配置或应用程序配置文件中进行设置。

祝你好运。

【讨论】:

    【解决方案2】:

    你可以这样设置keep-alive:

        @Bean
        public MongoDbFactory mongoDbFactory() throws Exception {
            MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder();
            optionsBuilder.socketKeepAlive(true);
            return new SimpleMongoDbFactory(new MongoClientURI(mongoUri, optionsBuilder));
        }
    

    【讨论】:

    • 感谢您的建议。由于各种原因,我们移到了 azure 之外的独立 mongo,但问题没有重现。
    • 如果你决定回到 Azure,你也可以尝试设置 maxConnectionIndeTime 选项,因为这个 Azure 问题 - docs.mlab.com/connecting/#known-issues 它对我有帮助。
    • 我在使用 Azure Cosmos DB (Mongo) 时遇到了类似的问题。设置 keep-alive 不起作用,但设置 maxConnectionIdleTime 时间确实解决了问题。
    • @DillonRyanRedding 我遇到了同样的问题,但是查看文档,maxConnectionIdleTime 默认为 0,这意味着没有限制。你们是怎么配置的?
    • @dmendezg 我按照 Vasyl Teraz 提供的文档的建议进行设置。具体来说,docs.mlab.com/connecting/…。我确实通过 Spring 的外部配置使其可配置,以防以后需要更改。
    猜你喜欢
    • 2015-09-22
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多