Как проверить, загружен ли уже другой экземпляр Derby?

Я пишу какое-то Java-приложение, которое использует Java DB (например, Apache 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 Client подключается к моей базе данных. Итак, все работает, как и ожидалось, но я хотел бы иметь возможность проверить это в моем методе getConnection(). Другими словами, я хотел бы проверить, открыты ли какие-либо сеансы для моей базы данных, и, например, закрыть их, создать собственное исключение или отобразить диалоговое окно с ошибкой. Я не знаю, как это сделать.

Спасибо


person Marcin    schedule 04.02.2013    source источник


Ответы (3)


Вместо того, чтобы объявлять, что ваше приложение «генерирует SQLException», вы можете использовать блок «try», чтобы поймать SQLException, затем изучить исключение и решить, является ли оно исключением «Другой экземпляр Derby» или нет.

Затем вы можете создать собственное исключение из своего метода getConnection соответственно.

person Bryan Pendleton    schedule 04.02.2013

Я изменил свой метод 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;            
    }
person Marcin    schedule 05.02.2013

Профилактика лучше, чем лечение. 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.

person Bimalesh Jha    schedule 12.02.2013