Как прервать / отменить запрос HSQLDB

У меня есть приложение 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 или переделать мое приложение? Невозможность отменить выполняющийся запрос - это неприятность.


person Keith    schedule 04.12.2015    source источник
comment
Вероятно, просто прервите поток. Не знаю, как это обрабатывается в HSQLDB, но стоит попробовать, поскольку его довольно просто реализовать.   -  person bedrin    schedule 05.12.2015


Ответы (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/ для Детали.

person Christian Bender    schedule 20.04.2016
comment
Мои мысли точно. Я также видел эти ошибки, используя метод ALTER SESSION. Даже если не было выдано никаких ошибок, как мне узнать, какой идентификатор сеанса освободить? Я согласен, что тайм-аут - это не решение. Некоторые запросы, естественно, занимают много времени, и у пользователя должен быть способ отменить запрос, если он больше не хочет ждать. - person Keith; 21.04.2016
comment
Я совсем забыл об этом. Да, более новые версии HSQLDB теперь поддерживают отмену запросов через JDBC API. Для более старых версий я просто отбрасывал текущий запрос на задний план, игнорировал его и продолжал. - person Keith; 21.09.2017

Вы можете использовать отдельное соединение с правами администратора и завершить транзакцию в другом сеансе:

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 ().

person fredt    schedule 05.12.2015
comment
Это специфично для HSQLDB. Нет ли способа через интерфейс JPA или JDBC отменить запрос? Если бы я использовал этот запрос, мне пришлось бы делать это в приложении. Как мне узнать, какую сессию выпустить? Есть ли способ получить и сохранить идентификатор сеанса, чтобы я мог использовать его позже, чтобы отправить этот запрос, чтобы выпустить его? - person Keith; 07.12.2015
comment
Означает ли это, что это можно сделать только при использовании HSQLDB в режиме сервера (hsql://), а не в режиме локального файла (file:)? - person golimar; 31.03.2016
comment
Это можно сделать как в серверном, так и в встроенном режиме, используя другой сеанс. - person fredt; 31.03.2016