2015-12-04 4 views
1

У меня есть приложение Java SE, использующее JPA, предоставленную Hibernate и базой данных HSQL. Приложение запрашивает базу данных с EntityManagers для получения информации, чтобы рисовать диаграммы на экране. Во время выполнения запроса область диаграммы имеет типичный значок поворота, чтобы пользователь знал, что он работает. Некоторые запросы занимают много времени, и я хочу, чтобы функция прерывала/отменяла запрос. Я знаю, что могу развернуть EntityManager и получить сеанс Hibernate и вызвать cancelQuery(), но это ничего не делает, потому что драйвер HSQLDB не поддерживает метод cancel() в интерфейсе Statement (http://hsqldb.org/doc/2.0/apidocs/org/hsqldb/jdbc/JDBCStatement.html#cancel()). Есть ли другой способ либо через API, либо перепроектировать мое приложение? Невозможность отменить выполняемый запрос является неприятностью.Как отменить/отменить запрос HSQLDB

+0

Наверное, просто прерывание Thread будет работать. Не знаю, как это обрабатывается в HSQLDB, но стоит попробовать, так как это довольно просто реализовать. – bedrin

ответ

1

В момент Момента не существует конца для завершения долгого заявления на сервере HSQLDB. Метод ALTER SESSION, предоставленный Fredt, похоже, не работает в текущем RC2 для версии 2.3.4 (а также в редакции 5511 svn), это просто приводит к откату транзакции: ошибка сериализации ПОСЛЕ завершения инструкции select. Таким образом, единственный способ справиться с этой проблемой - установить Timeout. Однако это не является реальным решением проблемы.

Обновление: В новейшей версии HSQLDB в репозитории SVN (Rev. 5627) и в предстоящем выпуске 2.3.4 теперь появилась возможность отменить утверждение. Также существует новый метод ALTER SESSSION END STATEMENT, который может прервать транзакцию без отката. См. https://sourceforge.net/p/hsqldb/bugs/1436/.

+0

Мои мысли точно. Я также видел эти ошибки, используя метод ALTER SESSION. Даже если не было ошибок, как я должен знать, какой идентификатор сеанса выпустить? Я согласен, что тайм-аут - это не решение. Некоторые запросы, естественно, занимают много времени, и пользователь должен отменить запрос, если они больше не хотят ждать. – Keith

+0

Я совсем забыл об этом. Да, новые версии HSQLDB теперь поддерживают отмену запросов через API JDBC. Для более старых версий я просто просто бросил выполняемый запрос в фоновый режим, проигнорировал его и перешел. – Keith

2

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

ALTER SESSION <session number> RELEASE 

http://hsqldb.org/doc/2.0/guide/sessions-chapt.html#snc_statements

В последнем Subversion пересмотров HSQLDB, это утверждение также завершает любое ВЫБЕРИТЕ заявление, выполняется в целевом сеансе.

Вы можете использовать SESSION_ID(), чтобы найти идентификатор сеанса и использовать его для освобождения сеанса.

Кроме того, перед выполнением запроса можно использовать JDBCStatement.setQueryTimeout (n).

Метод cancel() может быть поддержан в ближайшем будущем.

+0

Это специфичный для HSQLDB. Разве нет пути через интерфейс JPA или JDBC для отмены запроса? Если бы я использовал этот запрос, мне пришлось бы делать это в приложении. Как я узнаю, какую сессию выпустить? Есть ли способ получить и сохранить идентификатор сеанса, поэтому я могу использовать его позже, чтобы отправить этот запрос, чтобы его выпустить? – Keith

+0

Означает ли это, что это можно сделать только при использовании HSQLDB в режиме сервера ('hsql: //'), а не в локальном файле ('файл:')? – golimar

+0

Это можно сделать как в режиме сервера, так и в вложенном режиме, используя другой сеанс. – fredt

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