2017-01-01 7 views
1

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

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?

Update

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

Update 2

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

+0

В ваш запрос по списку рассылки derby-пользователя было внесено предложение: http://apache-database.10148.n7.nabble.com/Shutdown-Derby-database-using-JPA-not-DriverManager-tp147171p147172. html –

+0

Предложение: список всех служб, экспортируемых пакетом Derby, возможно, есть тот, который выставляет драйвер или оболочку вокруг базы данных –

ответ

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^