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 была более явной при описании этого процесса.

11.12.2008 00:44:56
2 ОТВЕТА
РЕШЕНИЕ

ODP.NET требует, чтобы вы очистили вещи. Так что вы:

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

Айов: убери то, что ты создаешь.

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

9
11.12.2008 08:46:54
Я бы добавил OracleDataReader в список объектов для удаления, если вы их используете. Кажется, это решило нашу проблему «максимальных открытых курсоров».
Fueled 2.12.2011 16:07:36

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

0
11.12.2008 01:40:31