Как прервать выполнение хранимой процедуры при использовании OracleDataReader?
Есть клиент на c#, подключается к субд oracle через ODP.NET Managed. Отмена команд работает, но если выполнение доходит до метода Read класса OracleDataReader, то прервать выполнение становится невозможно. Хранимая процедура выполняется примерно 30-40 секунд(строится отчет), если запрос на отмену произошел до вызова до метода Read класса OracleDataReader, то все нормально отменяется. Принудительное закрытие(вызов метода close) OracleDataReader-а, команды и соединения(oracleconnection) не помогает. Получается, что реальное выполнение запроса начинается только при попытке чтения данных, потому что, если в хранимой процедуре сначала сохранить все данных в nested_table, а потом уже из нее возвращать ref cursor приложению, то все нормально отменяется, но это очень неудобно реализовывать(и наверное не очень эффективно).
просто oracle получает запрос, думает и потом уже начинает выдавать данные.
Вот пока он думает - ридер "висит" в ожидании...
Тестировал, если запрос на отмену вызовется раньше ридера, то все ок. Причем в случае отмены в хранимой процедуре ловится исключение, что операция отменена пользователем, но если уже вызван метод read, то похоже команда никакую отмену уже не вызывает.
Кстати почему бы не загнать кусок добычи данных в фоновый поток и либо грохать его по отмене, либо просто забывать...?
Вариант, но прерывать поток же не рекомендуется(Thread.Abort)? Что удивляет, что закрытие ридера никак на него не влияет(никаких исключений не бросает), т.е. его можно закрыть, но отвиснет он только после выполнения процедуры.
В таком случае, у проблемы, похоже, нет решения, кроме вами же предложенного с курсорами или Thread.Abort. В любом случае, как я понимаю, хранимка будет-таки выполнена полностью, но результат проигнорируется.
Разве что, при разрыве соединения с базой Read вылетит с эксепшном, а выполнение процедуры на сервере прервется, скорее всего. Но это предположение, и тоже не выглядит красиво, особенно если рвать соединение для всего пулла.