ODP.net закрывает указатель ссылки при закрытии соединения? - PullRequest
5 голосов
/ 11 декабря 2008

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

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

Ответы [ 2 ]

9 голосов
/ 11 декабря 2008

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

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

I.o.w .: очистить то, что вы создаете.

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

0 голосов
/ 11 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...