Завершение работы базы данных Derby с использованием JPA, а не DriverManager

У меня есть клиентское приложение RCP, которое использует встроенный Derby в той же JVM для сохранения. Я получаю к нему доступ через JPA, используя RESOURCE_LOCAL и Eclipse Link в качестве поставщика JPA. Я оставляю запуск экземпляра Derby в JPA и persistence.xml.

factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, props);

persistence.xml

<properties>
    <property name="eclipse.weaving" value="false" />
    <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
    <property name="javax.persistence.jdbc.url" value="jdbc:derby:pathToDb" />
    <property name="eclipselink.logging.level.sql" value="FINEST" />
    <property name="eclipselink.logging.parameters" value="true" />
</properties>

В одном месте приложения мне нужно остановить базовую базу данных Derby. Все примеры показывают звонки:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
DriverManager.getConnection("jdbc:derby:pathToDb;shutdown=true");   

Это проблематично, особенно в приложении RCP с несколькими загрузчиками классов (оно использует OSGI под прикрытием). Я пытался использовать

if (factory.isOpen())
        factory.close();

но это не отключает экземпляр Derby, только соединение JPA с ним.

Есть ли способ, используя JPA, отключить базовый экземпляр Derby?

Обновить

Я попытался с помощью консоли OSGI остановить пакеты, связанные с постоянством, включая javax.persistence, JPA и Derby. Остановка этих действий не снимала блокировки файлов, которые Derby устанавливал для файлов журнала.

Обновление 2

Пересмотрено, чтобы уточнить, что использование не в приложении сервера OSGI.

1 ответ

Решение

Проблема была не в загрузчике классов, а в проблеме импорта.

Приложение RCP имеет "целевую платформу", которая динамически ищет в платформе зависимости. Это не происходит при вызове Class.forName(). Как только я явно добавил кувшин Derby к зависимостям моего пакета, класс был найден, и база данных закрылась должным образом.

Извлеченный урок: проверьте простые вещи, прежде чем предположить, что это сложно!

Другие вопросы по тегам