Как отменить продолжительную операцию Базы данных?

Еще одно отличие, которое здесь не указано.

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
    for (T o : a) {
        c.add(o); // correct
    }
}

Но следующее приведет к ошибке времени компиляции.

static <T> void fromArrayToCollection(T[] a, Collection<?> c) {
    for (T o : a) {
        c.add(o); // compile time error
    }
}
26
задан Rob P. 21 May 2009 в 04:00
поделиться

8 ответов

Я не думаю, что это возможно. Вот ссылка на обсуждение этой темы на сайте Oracle: http://forums.oracle.com/forums/thread.jspa?threadID=400492&start=15&tstart=0

-2
ответ дан 28 November 2019 в 07:42
поделиться

Oracle представила ALTER SYSTEM CANCEL SQL в 18c. Необходимо было бы добавить некоторый комментарий с UID к SQL и затем искать его что-то вроде этого

SELECT S.SID||','||S.SERIAL#
                    FROM GV$SESSION S, V$SQL Q
                    WHERE S.USERNAME IS NOT NULL
                    AND S.STATUS = 'ACTIVE'
                    AND S.SQL_ID IS NOT NULL
                    AND Q.SQL_ID = S.SQL_ID
                    and sql_text like '%{queryId}%'

И затем выполнить другую операцию от.NET ALTER SYSTEM CANCEL SQL 'SID, SERIAL'

0
ответ дан 28 November 2019 в 07:42
поделиться

Если вы используете ADO.NET и поставщик данных SQL, обратите внимание на метод SqlCommand.Cancel. Это то, что вы ищете. Однако он пытается отменить, и отмена может занять время. По сути, SQL Server должен решить, когда предоставить ваш запрос на отмену. Когда запрос отменяется, вы должны получить SqlException, указывающее, что операция была отменена пользователем. По-видимому, вы не хотите рассматривать это исключение как исключение и обрабатывать его особым образом, например, если SqlException вызвано отменой операции пользователем, просто проглотите его.

10
ответ дан 28 November 2019 в 07:42
поделиться

Я почти уверен, что это возможно - мы используем TOAD для Oracle, и это позволяет вам отменять длительные запросы, , как описано здесь . Я не знаю, как они это делают.

5
ответ дан 28 November 2019 в 07:42
поделиться

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

3
ответ дан 28 November 2019 в 07:42
поделиться

Я думаю, что лучшим решением кажется уничтожение сессий через таблицу мониторинга.

С Oracle вы можете сделать это, как говорит Burnsys

В Firebird 2.5 это будет выглядеть так же

Я надеюсь, что нечто подобное существует в Ms SQL

3
ответ дан 28 November 2019 в 07:42
поделиться

Если вы используете команду SQLCommand, вы можете попробовать вызвать ее метод Cancel .

2
ответ дан 28 November 2019 в 07:42
поделиться

А как насчет открытия нового подключения к базе данных, входа в систему как sysdba и отправки команды «ALTER SYSTEM KILL SESSION 'sid, serial #' IMMEDIATE» с указанием SID процесса, который вы хотите завершить.

Чтобы получить идентификатор сеанса: выберите sid из v $ mystat, где rownum = 1

Чтобы получить серийный номер: выберите sid, серийный номер из v $ session, где sid =: SID

http: // www .oracle-base.com / article / misc / KillingOracleSessions.php

РЕДАКТИРОВАТЬ: Идея WW, чтобы не входить в систему как sysdba здесь: http://forums.oracle.com/forums/thread.jspa?threadID=620578

2
ответ дан 28 November 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: