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 ExceptionandDB is down.是我用来验证是否捕获某些异常的打印语句。以下是相关代码:

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

这是由于驱动程序失去连接而发生的。这是 mongo 错误跟踪器上的一个问题,引用它https://jira.mongodb.org/browse/JAVA-481

于 2013-04-17T12:25:53.943 回答
0

我遇到过同样的问题。这是因为我重新启动了 mongod 而没有重新启动我的 java 服务器(在我的例子中是 tomcat)。重启tomcat解决了这个问题,因为mongo驱动丢失了

于 2014-11-26T21:38:54.043 回答