4

MongoDbを使用していますが、DBからレコードを読み取るときに問題が発生します。カーソルでそれらを取得することはできますが、cursor.hasNext()を使用してカーソルからレコードを取得しようとすると、次の例外が発生します。

com.mongodb.MongoInternalException: couldn't get next element
        at com.mongodb.DBCursor.hasNext(DBCursor.java:459)
Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:146)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
        at org.bson.io.Bits.readFully(Bits.java:35)
        at org.bson.io.Bits.readFully(Bits.java:28)
        at com.mongodb.Response.<init>(Response.java:35)
        at com.mongodb.DBPort.go(DBPort.java:101)
        at com.mongodb.DBPort.go(DBPort.java:66)
        at com.mongodb.DBPort.call(DBPort.java:56)
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211)
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:220)
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:220)
        at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:266)
        at com.mongodb.DBCursor._check(DBCursor.java:309)
        at com.mongodb.DBCursor._hasNext(DBCursor.java:431)
        at com.mongodb.DBCursor.hasNext(DBCursor.java:456)

データが継続的に増加しているため、この問題に直面している可能性があります。そのため、カーソル内のレコード数が増えています。また、私がアクセスしているデータベースはリモートマシン上にあります。

これについて助けが必要です。

ありがとう!

4

1 に答える 1

4

あなたが説明したことに基づいて、コレクションが重い読み取り負荷と書き込み負荷の両方を経験しているときに、PHPでこの問題が発生したと思います。一部の読み取りは機能する可能性がありますが、最終的にはタイムアウトし始めます。カーソルのタイムアウトは 30 秒に設定されていますが、バックエンドのデータ マイニング/処理に Mongo を使用しているため、これは問題ではありません。サーバーを分割することで問題をある程度軽減することができましたが、問題は依然としてかなり定期的に発生しています. これは、Mongo のほとんどがシングル スレッドであるため、重い負荷が長い処理キューになり、最終的にタイムアウトになるという事実に起因すると思います。

また、RAM がインデックス データまたは実際のデータでいっぱいになっていないことを確認します。その場合、Mongo はハード ドライブにアクセスしてそのデータを取得する必要があり、メモリから読み取るよりも80 倍以上遅くなります。 . db.getStats()問題のデータベースに対して実行することで、インデックス/データのフットプリントを確認できます。

于 2011-04-03T06:43:16.707 に答える