У меня есть приложение Java SE, использующее JPA, предоставленное Hibernate, и базу данных HSQL. Приложение запрашивает информацию в базе данных с помощью EntityManager, чтобы рисовать диаграммы на экране. Во время выполнения запроса в области диаграммы отображается типичный вращающийся значок, позволяющий пользователю узнать, что он работает. Некоторые запросы занимают много времени, и я хочу иметь возможность прерывать / отменять запрос. Я знаю, что могу развернуть EntityManager и получить сеанс Hibernate и вызвать cancelQuery (), но это ничего не делает, потому что драйвер HSQLDB не поддерживает метод cancel () в интерфейсе Statement (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCStatement.html#cancel()). Есть ли другой способ - через API или переделать мое приложение? Невозможность отменить выполняющийся запрос - это неприятность.
Как прервать / отменить запрос HSQLDB
Ответы (2)
В настоящий момент нет способа завершить длительный оператор на сервере HSQLDB. Метод ALTER SESSION, предоставленный Fredt, похоже, не работает в текущем RC2 для 2.3.4 (а также в svn revision 5511), он просто приводит к откату транзакции: сбой сериализации ПОСЛЕ того, как оператор select завершил работу. Таким образом, единственный способ справиться с этой проблемой - установить тайм-аут. Однако это не настоящее решение проблемы.
Обновление: в последней версии HSQLDB в репозитории SVN (Rev.5627) и в предстоящем выпуске 2.3.4 теперь реализована возможность немедленной отмены оператора. Также есть новый метод ALTER SESSSION END STATEMENT, который может прервать транзакцию без отката. См. https://sourceforge.net/p/hsqldb/bugs/1436/ для Детали.
Вы можете использовать отдельное соединение с правами администратора и завершить транзакцию в другом сеансе:
ALTER SESSION <session number> RELEASE
http://hsqldb.org/doc/2.0/guide/sessions-chapt.html#snc_statements
В последних версиях HSQLDB Subversion этот оператор также завершает любой оператор SELECT, выполняемый в целевом сеансе.
Вы можете использовать SESSION_ID (), чтобы найти идентификатор сеанса и использовать его для освобождения сеанса.
Кроме того, можно использовать JDBCStatement.setQueryTimeout (n) перед выполнением запроса.
В ближайшем будущем может появиться поддержка метода cancel ().
hsql://
), а не в режиме локального файла (file:
)?
- person golimar; 31.03.2016