簡體   English   中英

如何檢查Derby的另一個實例是否已經啟動?

[英]How to check if another instance of Derby is already booted?

我正在編寫一些使用Java DB(即Apache Derby)作為數據庫的Java應用程序。 我使用以下方法連接到數據庫:

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 Client連接到我的數據庫時,就會發生這種情況。 所以一切都按預期工作,但是我希望能夠在我的getConnection()方法中進行檢查。 換句話說,我想檢查數據庫是否打開了任何會話,例如,關閉它們,拋出自己的異常或顯示錯誤對話框。 我不知道該怎么做。

謝謝

無需聲明應用程序“引發SQLException”,而是可以使用“ try”塊來捕獲SQLException,然后檢查該異常並確定它是否為“ Derby的另一個實例”異常。

然后,您可以相應地從“ getConnection”方法引發您自己的異常。

我將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;            
    }

預防勝於治療。 IMO,捕獲異常然后意識到它是重復的Derby服務器啟動不是一個理想的設計。 最好是防止重復實例化。 如果可能的話,您可以同步getConnection()方法或使其成為單例類的一部分,或者從啟動/主類的靜態初始化程序塊中加載嵌入式Derby驅動程序,該類僅由JVM加載一次,因此Derby將僅啟動一次。 main / startup類中的以下操作應該可以解決問題:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM