2

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

我的 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

创建连接似乎工作正常。我遇到的问题是我现在不确定如何关闭此函数创建的连接。

4

1 回答 1

2

选项1

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

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

相比之下,通过调用 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

有关详细信息,请访问 MSDN


选项 2

看看 Oracle 推荐的最佳实践:

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

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

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

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

因此,最佳实践是 Close() AND Dispose() 所有 Oracle ODP.NET 对象(包括 OracleConnection)以强制清理它们

这个答案归功于Christian Shay


于 2014-04-24T14:23:46.587 回答