使用VB.net数据库连接维护内存的示例
我在数据库连接处理方面有一个特别的问题,尽管在处理连接、数据集和数据表时有很多来回的过度处理,但作为一个新的VB程序员,我不能完全理解它。我的项目有一个表单,其中有一个简单的“导入数据库”按钮,可以打开一个连接。假设我有一个包含多个数据集和数据表的数据库,这些数据集和数据表占用大量内存,因此我必须小心打开和关闭东西。我有一个按钮关闭数据库时,完成了它。代码大致如下,不会抛出错误(即,我可以连接,获取正确的数据,然后关闭数据库而不会抛出错误) 现在在另一节课上使用VB.net数据库连接维护内存的示例,vb.net,Vb.net,我在数据库连接处理方面有一个特别的问题,尽管在处理连接、数据集和数据表时有很多来回的过度处理,但作为一个新的VB程序员,我不能完全理解它。我的项目有一个表单,其中有一个简单的“导入数据库”按钮,可以打开一个连接。假设我有一个包含多个数据集和数据表的数据库,这些数据集和数据表占用大量内存,因此我必须小心打开和关闭东西。我有一个按钮关闭数据库时,完成了它。代码大致如下,不会抛出错误(即,我可以连接,获取正确的数据,然后关闭数据库而不会抛出错误) 现在在另一节课上 Private Class Data
Private Class DataBaseOps
Public OpenCon As OleDb.OleDbConnection
Public Sub OpenDataBase(strPath as String)
'My.Settings.ConnectionString is a variable in App.Config
OpenCon = New OleDb.OleDbConnection(My.Settings.ConnectionString & strPath)
OpenCon.Open()
End Sub
Public Sub PopulateMyDataSet()
'...Populate my datasets and tables based on data from the database
'...Note that for the adapters I include "Using" to help keep those clean when I no longer need them
End sub
Public Sub CloseDatabase()
Try
OpenCon.Close()
Catch ex As Exception
MessageBox.Show("No Database file loaded.")
End Try
End Sub
Overrides Sub Finalize()
'...Datasets get .Dispose() which is a topic of its own elsewhere.
OpenCon.Dispose()
End Sub
End Class
请记住,还有其他方法可以做到这一点,但这里的关键因素是打开连接,保持连接打开以填充数据网格,在数据库中执行一些其他工作,然后关闭连接,释放连接和数据集内存
我的问题是,我尝试了各种方法来限制“ConnectedDB”及其数据集的范围,包括在进程中放入Finalize()子对象,试图将其从内存中删除。我也曾玩弄过范围界定,但这两种方法都不完美,而且似乎能将项目保留在记忆中。
使用我的通用代码,我可以做些什么来清理内存资源?作为一个相对较新的VB.net程序员,我是否遗漏了一些明显的东西(比如我可以继承一个类到另一个类,而不是调用它们?在Finalize方法中,在
OpenCon.Dispose()之后添加这两行代码
将您的连接保持在使用它们的本地位置。然后可以使用…End Using块来确保它们已关闭和释放
感谢邓肯·爱德华兹·琼斯的这句话
“数据库连接就像冰箱门——你只需打开它
当你需要什么的时候,你只需要拿出你需要的,然后
取出所需物品后立即关闭。”
一个数据集可以包含多个数据表。我不知道为什么您需要不止一个数据集
Class Form1
Private ConnectedDB As DataBaseOps
Private ds As DataSet
Private Sub ImportDatabaseButton(sender As Object, e And eventargs) Handles ImportDatabaseButton.click
Dim OpenDial As New OpenFileDialog
'Open filedialog and return the path, etc.
Dim strPATH = OpenDial.FileName
ConnectedDB = New DataBaseOps(strPATH)
End Sub
Private Sub populateDSDT()
'...populate my datasets which then populate my datagrids
ds = ConnectedDB.PopulateMyDataSet()
'...populate my datagrids
End Sub
End Class
Public Class DataBaseOps
Private DBFile As String
Public Sub New(file As String)
DBFile = file
End Sub
Public Function PopulateMyDataSet() As DataSet
Dim ds As New DataSet
Using OpenCon As New OleDb.OleDbConnection(My.Settings.ConnectionString & DBFile)
OpenCon.Open() 'But don't do this until directly before the .Execute...
'...Populate my datasets and tables based on data from the database
'...Note that for the adapters I include "Using" to help keep those clean when I no longer need them
End Using
Return ds
End Function
End Class
删除此:Public OpenCon As OleDb.OleDbConnection
。当您需要打开连接时,请在适当的位置进行。使用Using
语句,或者使用.Dispose()
将其删除,并处理您创建的所有其他一次性对象。连接池是被管理的。如果我理解你的话,我最初在设计代码时就想到了这一点。只要根据需要打开/关闭连接。然而,有许多操作需要它打开(扩展它的生命周期),因此我最终选择保持它打开,以使程序能够简单地完成它们的工作,然后在用户完成后关闭它。连接的生命周期在其他地方管理。不要试图推翻这种逻辑。您不需要尝试保持连接打开。当代码需要连接时,它只要求提供一个连接(您的代码不创建连接,而是从池中接收一个连接,池管理其托管对象的生命周期)。您可以使用一种方法,该方法创建一个新的连接对象,返回该对象,并在请求该对象的方法执行其任务后立即处理其销毁(只是为了修改代码)。我实际上只有两个数据集,这只是为了保留数据的两个独立面(原始和熟的)。我可以把它们全部放在一个集合中,但我把它们分开,以防后面那个可怜的评论者。这不是我问题的一部分,但你和吉米都建议只要我需要,就使用这个连接。当我开始在SQLLand中使用数据库时会发生什么?我有大约40个查询,这些查询分块或全部排成一列,所以我想在重新整理数据时保持“冰箱门”打开。考虑到这一点,我认为Mary和Jimi对这个特定问题有最好的总体答案,那就是在我需要时保持连接打开/关闭。这进一步提出了不同的问题,关于在连接周围移动数据块的最佳方式,但这是另一个主题的另一个问题,当我有时间写它时,我将在我的主要问题中链接到这个主题。谢谢你们俩的帮助。
GC.Collect()
GC.WaitForPendingFinalizers()
Class Form1
Private ConnectedDB As DataBaseOps
Private ds As DataSet
Private Sub ImportDatabaseButton(sender As Object, e And eventargs) Handles ImportDatabaseButton.click
Dim OpenDial As New OpenFileDialog
'Open filedialog and return the path, etc.
Dim strPATH = OpenDial.FileName
ConnectedDB = New DataBaseOps(strPATH)
End Sub
Private Sub populateDSDT()
'...populate my datasets which then populate my datagrids
ds = ConnectedDB.PopulateMyDataSet()
'...populate my datagrids
End Sub
End Class
Public Class DataBaseOps
Private DBFile As String
Public Sub New(file As String)
DBFile = file
End Sub
Public Function PopulateMyDataSet() As DataSet
Dim ds As New DataSet
Using OpenCon As New OleDb.OleDbConnection(My.Settings.ConnectionString & DBFile)
OpenCon.Open() 'But don't do this until directly before the .Execute...
'...Populate my datasets and tables based on data from the database
'...Note that for the adapters I include "Using" to help keep those clean when I no longer need them
End Using
Return ds
End Function
End Class