У меня есть два приложения javafx: приложение и средство обновления. Приложение использует базу данных Firebird для хранения некоторых хрупких пользовательских данных. База данных работает во встроенном режиме (я думаю, это актуально), поэтому это означает, что одновременно может быть только одно соединение с базой данных (база данных создает файл блокировки). Updater обновляет приложение.
Вся схема выглядит так:
- Пользователь запускает приложение-> Приложение проверяет, требуется ли обновление, если оно требуется, затем запускает Updater (с использованием java ProcessBuilder) и закрывается (Platform.exit ()).
- Программа обновления проверяет, правильно ли завершено приложение.
- Updater запускает команду «App --export-user-data» (также используя ProcessBuilder) для экспорта наиболее важных вещей перед запуском обновления (это должно быть сделано таким образом - я не могу перенести эту функцию в Updater).
- Приложение зависает на первом сеансе .beginTransaction () - нет ни одной ошибки или исключения
Что я наблюдал до сих пор:
- Когда я запускаю приложение и закрываю его нажатием [X], все файлы блокировки из «C: \ ProgramData \ firebird» удаляются, но когда приложение запускает Updater и закрывается, файлы блокировки остаются нетронутыми. Думаю, поэтому Hibernate не может начать транзакцию.
- Процесс обновления не является подпроцессом приложения (я проверил это с помощью монитора процессов)
- Когда я запускаю Updater напрямую, он работает как шарм, поэтому проблема проявляется только тогда, когда приложение запускает Updater.
То, что я не могу делать:
- переключить базу данных на что-нибудь еще - она должна быть встроена в firebird
- переместить функцию экспорта в Updater
Я был бы рад выдвинуть даже самые странные идеи, потому что я потратил четыре дня, пытаясь решить эту проблему.
изменить: версия Firebird: 2.1 Версия Jaybird: 2.1.6
Способ запуска Updater (только необходимое)
public void startUpdater(){
ProcessBuilder pb = new ProcessBuilder(updaterPath, argument)
pb.start();
Platform.exit();
}
Platform.exit()
, скорее всего, завершает работу приложения и - iirc - дочерних приложений. Это, вероятно, означает, что встроенный Firebird не завершает работу должным образом, а также может означать, что процесс, запущенный с использованиемProcessBuilder
, также будет остановлен. - person Mark Rotteveel   schedule 24.11.2016