web-dev-qa-db-ja.com

MongoDBシャード-カーソルタイムアウトを無効にする

Javaアプリケーションでsharded-cluster(Mongoバージョン2.4.1)を使用しています。特定の時間(10分以上)後、次の例外が発生しました:

com.mongodb.MongoException$Network: Read operation to server cs-mongo-mongo-west-t:3306 failed on database mdb
    at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.Java:253)
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.Java:216)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.Java:288)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.Java:273)
    at com.mongodb.DBCursor._check(DBCursor.Java:368)
    at com.mongodb.DBCursor._hasNext(DBCursor.Java:459)
    at com.mongodb.DBCursor._fill(DBCursor.Java:518)
    at com.mongodb.DBCursor.toArray(DBCursor.Java:553)
    at com.mongodb.DBCursor.toArray(DBCursor.Java:542)
    at com.pribas.messagesdb.impl.GetMessagesDBHandlerImpl.handleRequest(GetMessagesDBHandlerImpl.Java:86)
    at com.pribas.messagesdb.impl.MessagesDBHandlerImpl.handleRequest(MessagesDBHandlerImpl.Java:37)
    at com.pribas.messagesdb.service.MessageServlet.processRequest(MessageServlet.Java:161)
    at com.pribas.messagesdb.service.MessageServlet.doPost(MessageServlet.Java:86)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:222)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
    at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:953)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1008)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:310)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at Java.lang.Thread.run(Unknown Source)

Sharded-clusterまたはconfig-file内でカーソルのこのタイムアウトを無効にする方法はありますか?現時点では、この問題はアプリケーションを再起動して新しい接続を確立することによってのみ解決できます。

ダニエル、本当にありがとう

3
DanielH

非アクティブなカーソルには10分のタイムアウトがあり、上書きすることができますが、注意が必要です。「永久」カーソルは、時間の経過とともにサーバー上に蓄積されると問題になる可能性があります。したがって、カーソルを時々正しく閉じ、可能であればそれを回避することをお勧めします。また、実際にここで問題を引き起こしているのはカーソルのタイムアウトであることを確認する必要があります(TCPタイムアウトなど)ではありません)。

タイムアウトをオフにするオプションには、基本的に noTimeoutフラグ の設定が含まれます。 Javaつまり、カーソルで addOption を使用して設定 QUERYOPTION_NOTIMEOUT

1
Adam C