如何检查是否已启动另一个Derby实例?

时间:2013-02-04 10:59:29

标签: java database-connection derby javadb

我正在编写一些使用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()方法中检查这一点。换句话说,我想检查是否有任何会话打开到我的数据库,例如,关闭它们,抛出我自己的异常或显示错误对话框。我不知道该怎么做。

THX

3 个答案:

答案 0 :(得分:0)

您可以使用“try”块来捕获SQLException,然后检查异常并确定它是否是“Derby的另一个实例”异常,而不是声明您的应用程序“抛出SQLException”。

然后,您可以相应地从“getConnection”方法中抛出自己的异常。

答案 1 :(得分: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;            
    }

答案 2 :(得分:0)

预防胜于治疗。 IMO,捕获异常,然后意识到它是重复的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嵌入式系统。