2016-04-24 12 views
1

MongoDB Java Driver 3.0バージョンに問題が発生しました。いくつかのコレクション(updateOne、find)上でいくつかの操作を実行した後、私はCommand failed with error 8: '24: Too many open files'エラーを受け取ります。私は私のコードでoftenly行う典型的な動作は、次のいずれかです。MongoDB Java API 3.0終了カーソル

private Document findFirst(int i) { 
    FindIterable<Document> cursor = collection.find(new Document("_id", i)).limit(1); 
    Document exists = null; 
    for (Document doc : cursor) { 
     exists = doc; 
     break; 
    } 
    return exists; 
} 

Document exists = findFirst(integer); 
return exists != null ? new MongoDBDocument(collection,exists) : null; 

と、私はIDのルックアップする際に、「セッション」がクローズされていない:だから

Set<Integer> s = new HashSet<>(); 
for (Document k : collection.find().projection(new Document("_id",1))) { //Fully scan the collection 
    s.add(Integer.valueOf((String)k.get("_id"))); 
} 
return s; 

、私がいるのを見ました古いAPIでは、検索操作の結果は閉じなければならないDBCursorを返しました。現在の実装では、カーソルは閉じられていないようです。私がこれを動作させるために見る唯一の方法は、毎回MongoClientを閉じることですが、おそらく私は正しい方法で何かをやっていないでしょう。おそらく、私がdb.getCollection(name)でコレクションを取得するときに、何らかの操作を行った後で何とか閉じなければならないかもしれません。ドキュメントを読み込もうとしましたが、何も助けてくれませんでした。

サーバのログから返されたエラーの詳細は、次のいずれかです。

私は間違っ
2016-04-24T13:20:32.839+0200 E STORAGE [conn721] WiredTiger (24) [1461496832:839907][968:0x700000934000], WT_SESSION.create: /data/db/index-1232-7182838846905439482.wt: Too many open files 
2016-04-24T13:20:32.840+0200 I COMMAND [conn721] command alledges.$cmd command: createIndexes { createIndexes: "2071853587", indexes: [ { key: { _id: 2071853587 }, name: "_id_2071853587", ns: "alledges.2071853587" } ] } keyUpdates:0 writeConflicts:0 exception: 24: Too many open files code:8 numYields:0 reslen:83 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 539ms 

?前もって感謝します。

答えて

0

問題は現在のWiredTigerの実装です。

mongodb --storageEngine mmapv1 
1

このエラーは通常、開いているファイル記述子が多すぎることに関連しています。確認および推奨設定については、ulimit referencesを参照してください。また、プロセス自体に課された制限を確認する必要があります(必ずしもシステム全体の設定である必要はありません)。 proc-file-systemを参照してください。

WiredTigerに関しては、一定期間アイドル状態になっている開いているテーブルを定期的に閉じる「スイープ」スレッドがあります。掃引スレッドは、オープンファイル記述子の数ではなく、アイドル時間に基づいて動作するため、WiredTigerは特定の時間に多くのファイルを開くことに応答しません。

もう1つ確認することは、MongoClientインスタンスをどのように利用するかです。 MongoClientは透過的に接続プーリングを行い、通常はJVMプロセスごとに1つのインスタンスしか持たないように注意してください。このクラスのインスタンスを頻繁に作成すると、あまりにも多くの接続を解放してから解放することができます(アイドル状態の接続)。

カーソルに関しては、サーバーが最終的にタイムアウトすることになりますが、カーソルを自分で閉じる方が効率的です。特に、カーソルが完全に使い果たされておらず、もはや必要でない場合。たとえば、あなたもあなたのfindFirst()方法を置き換えるために.first()を利用することができ、余分な先端のために

MongoCursor<Document> cursor = collection.find().iterator(); 
try { 
    while (cursor.hasNext()) { 
     System.out.println(cursor.next().toJson()); 
    } 
} finally { 
    cursor.close(); 
} 

:たとえば、あなたは、カーソルを閉じることができ

FindIterable<Document> cursor = collection.find(new Document("_id", i); 
return cursor.first()!=null; 
関連する問題