Закрывает ли ODP.net указатель ссылки при закрытии соединения?

Я пока не смог найти это явно где-либо заявлено, но множество примеров, которые я нашел в Интернете, следуют за тем, что я делал.

У меня есть класс C#, который использует ODP.net для подключения к базе данных Oracle и запуска процедуры в пакете.

В моем пакете есть хранимые процедуры, которые принимают выходной параметр курсора ref. Все, что делает процедура, - это открывает курсор для определенного оператора выбора.

Если я выполню эту процедуру непосредственно в базе данных oracle, то в конечном итоге я обнаружу ошибку максимального количества открытых курсоров.

Поэтому мне было интересно, действительно ли ODP.net закрывает этот курсор, который был открыт в моей процедуре?

Я использую метод OracleDataApaper.Fill (DataSet).

например.

DataSet ds = new DataSet();
OracleConnection conn = new OracleConnection(this.connStr);
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn);
OracleDataAdapter adapter = new OracleDataAdapter(com);
conn.Open();
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName";
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output);
com.CommandType = CommandType.StoredProcedure;

adapter.Fill(ds);
conn.Close();




PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS
  BEGIN
    open outCursor
      select 
        EAEMAL as Email
      from 
        EmailTable
      where 
        EmailName = searchParam;  
  END GETALLEMAILS;

Я просто боюсь оставить открытые курсоры в БД, вот и все. Если бы кто-нибудь мог предоставить ссылки на официальную документацию, было бы здорово!


Обновления:

Спасибо за вклад. Я звонил

com.Dispose();
conn.Close();
conn.Dispose();

но оставил их вне моего примера.

Я нашел это сообщение на форуме, в котором говорится, что метод OracleDataAdapter.Fill (Dataset) действительно освобождает курсор ref после выполнения метода Fill ().
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html

Я бы хотел, чтобы документация Oracle более подробно описывала этот процесс.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
9 233
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, наткнулся ли вы на статью это, и она не относится непосредственно к вашему вопросу, но она иллюстрирует то, что я узнал при работе с ODP.Net: в случае сомнений всегда закрывайте (соединения) и удаляйте. Каждый метод, который я пишу, который использует экземпляр соединений ODP, команд и / или курсоров, имеет предложение finally, удаляющее все.

Ответ принят как подходящий

ODP.NET требует от вас наведения порядка. Так что вы:

  • приходится удалять экземпляры OracleParameter, поскольку они содержат неуправляемые ресурсы (!), а Odp.net этого не делает
  • необходимо удалить объекты OracleCommand, так как они тоже содержат неуправляемые ресурсы, и закрытие соединения не закрывает их
  • открытые курсоры не могут существовать без открытого соединения, хотя в odp.net ничего не очищается после закрытия соединения (или удаления), поэтому вам также необходимо очистить их (и, конечно, до закрытия соединения).

I.o.w .: убирайте то, что вы создаете.

Возможно, OracleDataAdapter уже делает это за вас, но это неясно (и в документации odp.net об этом не говорится, поэтому вы должны проверить (нечитаемый) код с помощью отражателя, чтобы убедиться. Хотя практическое правило с odp .net: чтобы избежать утечки памяти, всегда вызывайте dispose для всего в порядке: параметр, курсор, команда, транзакция, соединение.

Я бы добавил OracleDataReader в список объектов для удаления, если вы их используете. Похоже, что решена наша проблема "максимальных открытых курсоров".

Fueled 02.12.2011 20:07

Другие вопросы по теме