У меня есть приложение 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
ответ
В момент Момента не существует конца для завершения долгого заявления на сервере 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/.
Мои мысли точно. Я также видел эти ошибки, используя метод ALTER SESSION. Даже если не было ошибок, как я должен знать, какой идентификатор сеанса выпустить? Я согласен, что тайм-аут - это не решение. Некоторые запросы, естественно, занимают много времени, и пользователь должен отменить запрос, если они больше не хотят ждать. – Keith
Я совсем забыл об этом. Да, новые версии HSQLDB теперь поддерживают отмену запросов через API JDBC. Для более старых версий я просто просто бросил выполняемый запрос в фоновый режим, проигнорировал его и перешел. – Keith
Вы можете использовать отдельное соединение с правами администратора и завершить сделку в другом сеансе:
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() может быть поддержан в ближайшем будущем.
Это специфичный для HSQLDB. Разве нет пути через интерфейс JPA или JDBC для отмены запроса? Если бы я использовал этот запрос, мне пришлось бы делать это в приложении. Как я узнаю, какую сессию выпустить? Есть ли способ получить и сохранить идентификатор сеанса, поэтому я могу использовать его позже, чтобы отправить этот запрос, чтобы его выпустить? – Keith
Означает ли это, что это можно сделать только при использовании HSQLDB в режиме сервера ('hsql: //'), а не в локальном файле ('файл:')? – golimar
Это можно сделать как в режиме сервера, так и в вложенном режиме, используя другой сеанс. – fredt
- 1. Параллельный запрос в HSQLDB
- 2. Как выполнить вложенный запрос в SPring HSQLDB
- 3. Невозможно выполнить запрос LIKE в HSQLDB
- 4. Hsqldb - выполнить запрос из строки ввода
- 5. Медленный запрос внутреннего соединения многих таблиц HSQLDB
- 6. HSQLDB как вручную вставить записи
- 7. Как HSQLDB поддерживает индексы?
- 8. HSQLDB - как предоставить привилегии?
- 9. Как подключиться к HSQLDB
- 10. Tomcat - HSQLDB
- 11. Менеджер HSQLDB?
- 12. свойства HSQLDB
- 13. PARTITION BY альтернативы HSQLDB
- 14. hsqldb indexOutOfBoundException
- 15. Обновление на вставке HSQLDB
- 16. HSQLDB PreparedStatement типы
- 17. HSQLDB: столбец не найден
- 18. HSQLDB эффективность поиска текста
- 19. Как использовать HSQLdb с Ibatis
- 20. Как использовать инструмент переноса HSQLDB
- 21. Как вызвать функцию HSQLDB MONTHS_BETWEEN?
- 22. Как добавить group_concat в hsqldb с отличным?
- 23. Mockito spy на подключении HSQLDB
- 24. HSQLDB подзапросов - Java
- 25. org.hibernate.exception.GenericJDBCException: не удалось выполнить запрос (HSQLDB, Hibernate, Spring, Maven)
- 26. запрос оракула в in-памяти hsqldb в режиме синтаксиса оракула
- 27. From_unixtime in derby and hsqldb
- 28. Сравнение hsqldb и mysql
- 29. HSQLDB - неверная спецификация авторизации
- 30. Оптимизация GROUP BY в hsqldb
Наверное, просто прерывание Thread будет работать. Не знаю, как это обрабатывается в HSQLDB, но стоит попробовать, так как это довольно просто реализовать. – bedrin