.NET Framework数据提供程序,用于Oracle多重打开连接

时间:2012-01-17 06:52:43

标签: asp.net vb.net oracle connection-pooling oracleclient

我在单独的类文件中有下面提到的代码,用于建立连接并执行数据库事务。我有一个问题,打开多个连接,有时超过连接池。当我逐步完成代码时,我发现有些代码在循环中调用ConnectDB()而不调用DisconnectDB()。但我预计条件OraConn.State = ConnectionState.Closed应该处理这种情况。不知何故,条件总是得到满足,从而打开另一组连接。你能说出我哪里出错了,还有什么最好的做法可以在这里采用?

Public Class Connection
Dim Str_conn As String = "Data Source=...; User=...; password=...; Min Pool Size=10; Max Pool Size=500;"
Public OraConn As OracleConnection
Dim cmd As OracleCommand
Dim dr As OracleDataReader
Dim data_adapt As OracleDataAdapter
Dim dt As DataTable
Dim ds As DataSet

Public Sub ConnectDB()
    OraConn = New OracleConnection(Str_conn)
    If OraConn.State = ConnectionState.Closed Then
        OraConn.Open()
    End If
End Sub

Public Sub DisconnectDB()
    If OraConn.State = ConnectionState.Open Then
        OraConn.Close()
    End If
End Sub

Public Function get_dataset(ByVal query As String, ByRef ds As DataSet) As DataSet
    data_adapt = New OracleDataAdapter(query, OraConn)
    data_adapt.Fill(ds)
    Return ds
End Function

Public Function get_datareader(ByVal query As String) As OracleDataReader
    cmd = New OracleCommand(query, OraConn)
    dr = cmd.ExecuteReader()
    Return dr
End Function

Public Sub UpdateDB(ByVal query As String)
    cmd = New OracleCommand(query, OraConn)
    cmd.ExecuteNonQuery()
    cmd.Dispose()
End Sub

该类在其他类中引用或直接在aspx.vb页面中引用。

Public Function InsertData(ByVal var1 As String, ByVal var2 As String) As Integer
    conn.ConnectDB()
    Dim qryInsert As String

    qryInsert = " INSERT INTO TABLE VALUES ('" & var1 & "', " 
    qryInsert = qryInsert & var2 & "')"        

    Try
       conn.UpdateDB(qryInsert) 
    Catch ex As OracleException
        If ex.Code = 1 Then
            updData(var1, var2)
       ElseIf ex.Code = 2091 Then
           msgprompt("Duplicate Unique Key!", "Warning")
       End If
    Finally
        conn.DisconnectDB()
    End Try
    Return count
End Function

在功能updData()中再次打开连接。虽然我知道必须正确关闭它,但是不能保留每个开发人员的标签。因此,我想通过使用相同的连接直接从连接类控制它,但条件If OraConn.State = ConnectionState.Closed没有帮助。

更新

我已将UpdateDB中的代码放在Using块下,并从InsertData(...)等函数中删除对ConnectDB和DisconnectDB的调用。看来这个问题已经解决了。但我想知道如果异常将连接保持打开状态?并且OraConn是一个在使用块之外定义的公共变量,因此它将由GC处理吗?

Public Sub UpdateDB(ByVal query As String)
    Using OraConn = New OracleConnection(Str_conn)
        cmd = New OracleCommand(query, OraConn)
        Try
            OraConn.Open()
            cmd.ExecuteNonQuery()
        Catch ex As Exception
            Throw
        Finally
            cmd.Dispose()
        End Try
    End Using
End Sub

1 个答案:

答案 0 :(得分:1)

无论如何,您必须在完成任务后立即关闭所有连接。

<强>建议:

关闭连接的最佳做法是在finally块中执行此操作。因此,即使存在任何错误,也请在catch块中捕获它(如果需要,请记录它),然后在finally块中关闭连接。

<强>更新

您可以在Connection课程中放置一个私人静态计数器。当调用ConnectDB()时,您将递增此计数器并在每个DisconnectDB()中递减它。现在在ConnectDB()中,你通过这种方式检查计数器的值,如果它超过你抛出错误的最小阈值;您可以了解代码中存在的空闲连接并重构它。在生产时保持此阈值高或在代码中忽略它。