Команда OracleClient - лучшие практики по использованию и утилизации команды - PullRequest
0 голосов
/ 16 июня 2009

В соответствии с документацией MSDN для OracleClient.OracleCommand:

Public Sub ReadMyData(ByVal connectionString As String)
    Dim queryString As String = "SELECT EmpNo, DeptNo FROM Scott.Emp"
    Using connection As New OracleConnection(connectionString)
        Dim command As New OracleCommand(queryString, connection)
        connection.Open()
        Dim reader As OracleDataReader = command.ExecuteReader()
        Try
            While reader.Read()
                Console.WriteLine(reader.GetInt32(0) & ", " _
                   & reader.GetInt32(1))
            End While
        Finally
            ' always call Close when done reading.
            reader.Close()
        End Try
    End Using
End Sub

OracleCommand не заключен в блок Using.

Вопрос: должно ли это быть? OracleCommand наследуется от DbCommand, который реализует IDisposable.

Я смотрю на код, который выполняет следующее, и у нас возникают проблемы с закрытием неявных курсоров:

     Dim cmd As OracleCommand = createCommand("some sql")
     ds = GetDataSet(cmd)
     cmd.Dispose()
     cmd = Nothing

GetDataSet выглядит так:

  Dim da As New OracleDataAdapter()
  Dim ds As New DataSet()

  Using conn As OracleConnection = GetOpenConnection()
     cmd.Connection = conn
     da.SelectCommand = cmd
     da.Fill(ds, 0)
     cmd.Connection = Nothing
  End Using
  da.Dispose()
  da = Nothing
  Return ds

Это приведет к утечке ресурсов?

Ответы [ 2 ]

1 голос
/ 16 июня 2009

Как вы определяете, что неявные курсоры открыты и что это проблема? Причина, по которой я спрашиваю, заключается в том, что вызов метода «Close» фактически не закрывает соединение. Он просто сообщает пулу, что он больше не используется и может быть перераспределен в другом месте. Это сделано из соображений производительности, потому что физическое открытие соединения стоит дорого. Одно и то же соединение будет многократно использоваться много раз и вполне может оставаться открытым даже после вызова «Закрыть», поэтому, если вы используете некоторые инструменты Oracle для однорангового соединения, это может сбить вас с пути.

Я никогда не видел причин явно распоряжаться объектом команды. Это просто набор параметров и другой информации.

Если вы используете блок using, как у вас, абсолютно не нужно явно вызывать «Close» или «Dispose» в коде. В этом весь смысл использования блока. Он защищает вас от забывания звонить в Close, поскольку это именно то, что он делает для вас.

1 голос
/ 16 июня 2009

Прежде всего, я думаю, что вы должны явно закрывать свои соединения в своем коде, потому что в зависимости от провайдера есть некоторая дополнительная работа, которая выполняется при вызове метода Close

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