Как убить длительный процесс сервлета из другого сервлета? - PullRequest
0 голосов
/ 12 февраля 2011

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

Поскольку я не могу уничтожить его в потоке базы данных, я пытаюсь уничтожить его из другого потока. Предоставляет ли какой-либо из контейнеров сервлетов рекомендуемый способ «отмены» или «уничтожения» потока запроса? Если я несу ссылку на поток, могу ли я вызвать прерывание или подобное?

Ответы [ 3 ]

1 голос
/ 12 февраля 2011

Тур вопрос не о java темы.Речь идет об убийстве запроса базы данных в базу данных .Я говорю это потому, что, насколько я понимаю, ваш вопрос заключается в том, что клиент отправляет HTTP-запрос сервлету, который выполняет соединение JDBC, и выполняет запрос, который занимает много времени.Таким образом, Java не работает на этот раз.БД делает.Это означает, что вы должны убить запрос БД в БД.Как это сделать?Это зависит от вашей базы данных.MySql (например) имеет своего рода оболочку командной строки, которая позволяет получать список текущих запросов и завершать запросы.Так что это то, что вы можете сделать.Ваш второй сервлет может подключаться к MySql, извлекать запущенные запросы, определять, какой из них следует уничтожить (это специфическая функциональность приложения), и уничтожать его.Я полагаю, что как только вы сделаете это, первый сервлет получит JDBCException и сможет выйти.

Это способ показать список запущенных запросов: http://www.electrictoolbox.com/show-running-queries-mysql/

Вот как убить запрос: http://dev.mysql.com/doc/refman/5.0/en/kill.html

И последнее замечание, которое, вероятно, должно бытьпервый.Проверьте, почему ваш запрос занимает так много времени?ИМХО в большинстве случаев это означает, что ваша схема не оптимальна или какой-то индекс отсутствует.Как правило, если ваш запрос занимает более 0,1 секунды, проверьте схему БД.

0 голосов
/ 13 февраля 2011

Вы можете java.sql.Statement.cancel(), вам нужно будет где-то зарегистрировать запущенные операторы (ServletContext или любую структуру, которую вы считаете подходящей) и не зарегистрировать после завершения.

Драйвер JDBC должен поддерживать этот метод (cancel()) также я не знаю, поддерживает ли PostgreSQL его, хотя

0 голосов
/ 12 февраля 2011
  1. Если вы выполняете запрос БД длиной в час, вам не следует в первую очередь обращаться к сервлету, так как поток ответа истечет, вы получите 504 .
  2. Могу ли я узнать, что делает этот запрос, что-то, связанное с вычислениями и большими обновлениями или вставками.
  3. Вы должны попробовать поместить этот запрос в БД JOBS.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...