2013-02-04 169 views
0

我在寫一些使用Java DB(即Apache Derby)作爲數據庫的Java應用程序。我用下面的方法來連接數據庫:如何檢查另一個Derby實例是否已經啓動?

Connection getConnection() throws SQLException { 

     EmbeddedDataSource ds = new EmbeddedDataSource(); 
     ds.setDatabaseName(dbUri); 
     ds.setPassword(password); 
     ds.setUser(username); 

     Connection conn = ds.getConnection();    
     conn.setSchema(schema); 

     return conn;    
    } 

這工作不錯,但有時我得到以下異常:

java.sql.SQLException: Another instance of Derby may have already booted the database 

發生這種情況時,我跑我的應用程序,並在同一時間的SQuirreL SQL客戶端已連接到我的數據庫。所以一切都按預期工作,但我希望能夠在我的getConnection()方法中檢查這一點。換句話說,我想檢查是否有任何會話向我的數據庫打開,例如關閉它們,拋出我自己的異常或顯示錯誤對話框。我不知道該怎麼做。

THX

回答

0

而不是宣佈你的應用程序「拋出的SQLException」,你可以使用一個「嘗試」塊捕獲的SQLException,然後檢查異常,並決定是否是「德比的另一個實例」異常或不。

然後,你可以從你的「getConnection」方法相應地拋出你自己的異常。

0

我修改了我的getConnection()方法,如下所示。它做我想要的:

Connection getConnection() throws SQLException, DAOConnection { 

     EmbeddedDataSource ds = new EmbeddedDataSource(); 
     ds.setDatabaseName(dbUri); 
     ds.setPassword(password); 
     ds.setUser(username); 

     Connection conn = null; 

     try { 
      conn = ds.getConnection(); 
     } catch (SQLException e) {   

      // check if cannot connect due to "Another instance of 
        // Derby may have already booted the database". 
        // The error code of this exception is 45000. 

      if (e.getNextException().getErrorCode() == 45000) { 
       throw new DAOConnection(e.getNextException().getMessage()); 
      } 

      throw new SQLException(e); 
     } 

     conn.setSchema(schema);       
     return conn;    
    } 
0

預防勝於治療。國際海事組織,捕捉異常,然後意識到它是重複的Derby服務器啓動不是一個理想的設計。更好的辦法是防止重複實例化。如果可能的話,您可以同步getConnection()方法或使其成爲單例類的一部分或從加載嵌入式Derby驅動程序的啓動/主類的靜態初始化程序塊,該類僅由JVM加載一次,因此Derby將僅啓動一旦。喜歡的東西下面的主/啓動類應該做的伎倆:

static { 
    try { 
     Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
    } 
    catch(Exception e){ 
    ..... 
    } 
} 

每此處的鏈接http://db.apache.org/derby/docs/10.3/devguide/tdevdvlp38381.html加載驅動程序應該啓動Derby嵌入式系統。

相關問題