【问题标题】:Closing DbConnection Created by Function关闭函数创建的 DbConnection
【发布时间】:2014-06-09 21:32:48
【问题描述】:

也许这是完全错误的做事方式,如果是这样,您能否指出我正确(优雅)的方式。 :)

我的 vb.net 项目中有一个模块。该模块处理数据库连接。这个想法是让其他模块在需要创建连接时使用这个模块。

对于每种数据库类型,我都有打开数据库连接的函数。作为一个例子,我有这个函数可以打开一个 oracle 连接。

Friend Function OracleConnection(ByVal HostAddress As String, ByVal PortNumber As String, ByVal DBName As String, ByVal UserId As String, ByVal Password As String) As OracleConnection
    Try
        OracleConnection = New OracleConnection("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" & HostAddress & ")(PORT=" & PortNumber & "))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=" & DBName & ")(FAILOVER_MODE=(TYPE=select)(METHOD=BASIC)(RETRIES=180)(DELAY=5))));User Id=" & UserId & ";Password=" & Password & ";")
        OracleConnection.Open()
        OracleConnection = OracleConnection
    Catch ex As OracleException
        MsgBox(ex.Message, MsgBoxStyle.Critical)
        OracleConnection = Nothing
    End Try
    Return OracleConnection
End Function

创建连接似乎工作正常。我的问题是我现在不知道如何关闭这个函数创建的连接。

【问题讨论】:

    标签: vb.net function dbconnection


    【解决方案1】:

    选项 1

    您应该始终通过调用CloseDispose 或在Using 语句中使用OracleConnection 对象来关闭OracleConnection 对象。

    否则,垃圾回收可能不会立即释放它们。如果在许多连接等待垃圾收集器删除时达到最大连接数,这种延迟可能会导致错误。

    相比之下,通过调用 Close 来关闭连接更有效地使用本机资源,增强了可扩展性并提高了整体应用程序性能。为确保连接始终关闭,请在 Using 块内打开连接。

    Public Sub InsertRow(ByVal connectionString As String)
        Dim queryString As String = "INSERT INTO Dept (DeptNo, Dname, Loc) values (50, 'TECHNOLOGY', 'DENVER')" 
    
        Using connection As New OracleConnection(connectionString)
            Dim command As New OracleCommand(queryString)
            command.Connection = connection
            Try
                connection.Open()
                command.ExecuteNonQuery()
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try 
        End Using 
    End Sub
    

    更多信息,visit MSDN


    选项 2

    查看 Oracle 推荐的最佳实践:

    http://www.oracle.com/technetwork/topics/dotnet/ow2011-bp-performance-deploy-dotnet-518050.pdf

    您在创建 OracleConnection 时会自动获得一个连接池。对于大多数中间层应用程序,您将希望利用它。您还需要通过打开注册表中的性能计数器来调整池以适应实际工作负载。

    有关连接池的详细信息,请参阅 ODP.NET 联机帮助。池设置被添加到连接字符串中。

    人们在使用 OracleConnections 时经常遇到的另一个问题是垃圾收集器没有意识到它们是真正的资源密集型,也没有及时清理它们。由于 ODP.NET 没有完全托管,因此一些资源对垃圾收集器隐藏,这使情况更加复杂。

    因此最佳做法是关闭()和处置()所有 Oracle ODP.NET 对象(包括 OracleConnection)以强制清理它们

    积分转到Christian Shaythis answer


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 2014-09-03
      • 2018-09-22
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多