Завершение работы базы данных 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 к зависимостям моего пакета, класс был найден, и база данных закрылась должным образом.
Извлеченный урок: проверьте простые вещи, прежде чем предположить, что это сложно!