0

我正在编写一些使用 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 客户端连接到我的数据库时,就会发生这种情况。所以一切都按预期工作,但我希望能够在我的getConnection()方法中检查这一点。换句话说,我想检查是否有任何会话打开到我的数据库,例如,关闭它们、抛出我自己的异常或显示错误对话框。我不知道该怎么做。

谢谢

4

3 回答 3

0

预防胜于治疗。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 嵌入式系统。

于 2013-02-12T02:33:28.220 回答
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;            
    }
于 2013-02-05T02:23:30.143 回答
0

与其声明应用程序“抛出 SQLException”,不如使用“try”块来捕获 SQLException,然后检查异常并确定它是否是“Another instance of Derby”异常。

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

于 2013-02-04T19:47:22.957 回答