也许这是完全错误的做事方式,如果是这样,你或许可以指出我正确(优雅)的方式。 :)
我的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
创建连接似乎工作正常。我遇到的问题是我现在不确定如何关闭由此函数创建的连接。
答案 0 :(得分:2)
您应始终通过调用Close
或Dispose
或使用Using
中的 OracleConnection 对象来关闭 OracleConnection 对象声明。
否则,垃圾收集可能不会立即释放它们。如果在垃圾收集器等待删除多个连接时达到最大连接数,则此类延迟可能导致错误。
相比之下,通过调用Close来关闭连接会更有效地使用本机资源,从而增强可伸缩性并提高整体应用程序性能。要确保始终关闭连接,请打开使用块内的连接。
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。
了解Oracle推荐的最佳做法:
http://www.oracle.com/technetwork/topics/dotnet/ow2011-bp-performance-deploy-dotnet-518050.pdf
创建OracleConnection时会自动获得连接池。对于大多数中间层应用程序,您将希望利用它。您还需要通过启用注册表中的性能计数器来调整池以获得实际工作负载。
有关连接池的详细信息,请参阅ODP.NET联机帮助。池设置将添加到连接字符串中。
人们在OracleConnections中遇到的另一个问题是,垃圾收集器并没有意识到它们是如何真正占用资源,并且没有及时清理它们。事实上,ODP.NET没有完全管理,因此一些资源对垃圾收集器是隐藏的。
因此,最佳做法是关闭()和Dispose()所有Oracle ODP.NET对象(包括OracleConnection)以强制它们被清理。
积分转到Christian Shay this answer。