3

現在、MongoDB Java API を使用するプロジェクトに取り組んでいます。私はしばらくこのプロジェクトに取り組んできましたが、最近、解決できない問題に遭遇しました。フォールト トレラントなデータベース システムを作成しようとしています。データベースのクラッシュをシミュレートするために、作成した Mongodb サーバーにプログラムを接続し、単純な読み取りまたは書き込みを実行してから、データベース サーバーをシャットダウンします。私は当初、これにより、呼び出している特定のメソッドがスローされ、MongoExceptionそれをキャッチしてデータベースのクラッシュから回復できると考えていました。しかし、特に EOFException をスローしていることを示す奇妙なスタック トレースが表示されます。以下はスタックトレースそのものです。

Mar 04, 2013 8:06:15 PM com.mongodb.DBPortPool gotError                     
WARNING: emptying DBPortPool to polaris.cs.wcu.edu/152.30.5.5:12345 b/c of error
java.io.EOFException                                                        
    at org.bson.io.Bits.readFully(Bits.java:48)                             
    at org.bson.io.Bits.readFully(Bits.java:33)                             
    at org.bson.io.Bits.readFully(Bits.java:28)                             
    at com.mongodb.Response.<init>(Response.java:40)                        
    at com.mongodb.DBPort.go(DBPort.java:124)                               
    at com.mongodb.DBPort.call(DBPort.java:74)                              
    at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:282)        
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:256)             
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:289)      
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:274)      
    at com.mongodb.DBCursor._check(DBCursor.java:368)                       
    at com.mongodb.DBCursor._hasNext(DBCursor.java:459)                     
    at com.mongodb.DBCursor.hasNext(DBCursor.java:484)                      
    at edu.wcu.cs.capstone.view.AbstractViewEngine.getView(AbstractViewEngine.java:57)
    at edu.wcu.cs.capstone.transaction.ServerTransactionManager.getView(ServerTransactionManager.java:52)
    at edu.wcu.cs.capstone.transaction.ServerTransactionManager.run(ServerTransactionManager.java:183)
    at java.lang.Thread.run(Thread.java:722)                                

Caught exception                                                            
Mar 04, 2013 8:06:15 PM com.mongodb.DBPortPool gotError                     
WARNING: emptying DBPortPool to polaris.cs.wcu.edu/152.30.5.5:12345 b/c of error
java.io.IOException: couldn't connect to [polaris.cs.wcu.edu/152.30.5.5:12345] bc:java.net.ConnectException: Connec
    at com.mongodb.DBPort._open(DBPort.java:214)                            
    at com.mongodb.DBPort.go(DBPort.java:107)                               
    at com.mongodb.DBPort.call(DBPort.java:74)                              
    at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:282)        
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:256)             
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:289)      
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:274)      
    at com.mongodb.DBCursor._check(DBCursor.java:368)                       
    at com.mongodb.DBCursor._hasNext(DBCursor.java:459)                     
    at com.mongodb.DBCursor.hasNext(DBCursor.java:484)                      
    at edu.wcu.cs.capstone.view.AbstractViewEngine.getView(AbstractViewEngine.java:61)
    at edu.wcu.cs.capstone.transaction.ServerTransactionManager.getView(ServerTransactionManager.java:52)
    at edu.wcu.cs.capstone.transaction.ServerTransactionManager.run(ServerTransactionManager.java:183)
    at java.lang.Thread.run(Thread.java:722)                                

DB is down.                                                                 
Exception in thread "Thread-3" java.lang.NullPointerException               
    at edu.wcu.cs.capstone.transaction.ServerTransactionManager.run(ServerTransactionManager.java:184)
    at java.lang.Thread.run(Thread.java:722)

Caught ExceptionとはDB is down.、特定の例外をキャッチしていることを確認するために使用している print ステートメントです。関連するコードは次のとおりです。

public View getView(Mongo mongo, Query query) throws MongoException,        
                                                     EOFException {         
    String connected = "";                                                  
    try {                                                                   
        connected = mongo.getConnectPoint();                                
    } catch (Exception e) {                                                 
        throw new MongoException("Error.");                                 
    }                                                                       
    System.out.println("Connected: " + connected);                          

    DB           db         = mongo.getDB(query.getServer());               
    List<DBObject> viewList   = new ArrayList<DBObject>();                  

    DBCollection collection = db.getCollection(query.getCollection());      
    DBCursor     cursor     = collection.find(query.getQuery(), excludeID); 

    try {                                                                   
        cursor.hasNext();                                                   
    } catch (Exception e) {                                                 
        System.out.println("Caught exception");                             
    }                                                                       
    while (cursor.hasNext()) {                                              
        viewList.add(cursor.next());                                        
    }                                                                       

    return new View(viewList);                                              
}

ご覧のとおり、 を呼び出すとエラーが発生していますcursor.hasNext()。また、実際には、Caught exception. ただし、キャッチされていないかのように、スタック トレースが引き続き取得されます。これがメソッドと関係があるのではないかと疑っていますがDBPortPoolgotError()、このメソッドのコードを調べたところ、実際に何をしているのか、どのように呼び出されているのかさえわかりません。( GrepCode リンク)

前述のように、このタイプのコードの動作は、データベースがアクティブでなくなったためMongoExceptionにその特定のオブジェクトの呼び出しが失敗したときにスローされると考えていました。Mongo誰でも提供できるヘルプをいただければ幸いです。

4

2 に答える 2

0

同じ問題がありました。Javaサーバー(私の場合はtomcat)を再起動せずにmongodを再起動したためです。mongoドライバーが失われたため、Tomcatを再起動するとこの問題が解決しました

于 2014-11-26T21:38:54.043 に答える
0

これは、ドライバーが接続を失ったために発生します。これは、 https: //jira.mongodb.org/browse/JAVA-481 を参照している mongo バグ トラッカーの問題です。

于 2013-04-17T12:25:53.943 に答える