在我的VB.NET项目中追踪内存泄漏一整天之后,我已经找到了FileMaker的ODBC驱动程序的错误原因!
要重现,您需要一个可以连接的数据库(我已经托管在Server Advanced 11.0.3上,但您也可以在本地托管它),以及在PC上注册/安装的ODBC驱动程序(我测试过的版本) 11.3和12.0,以及最新的12.2)。
启动一个新的VB.NET WinForms项目,在表单中添加一个按钮并将此代码粘贴到按钮的click事件上:
Using cn_FM As New Odbc.OdbcConnection("DRIVER={FileMaker ODBC};SERVER=192.168.1.xxx;UID=admin;PWD=admin;DATABASE=test;")
cn_FM.Open()
End Using
所有这些代码都打开了与FileMaker数据库的连接,但是如果您分析Windows任务管理器中的内存使用情况,您可以轻松地看到(通过反复单击您刚刚创建的按钮)cn_FM
不是处理得当,因为Handles不断增加!我尝试强制垃圾收集,但这没有做任何事情,所以我认为它与驱动程序本身存在问题。
哦,我测试了以相同的方式连接到SQL数据库,正如您所料,没有句柄泄漏......
任何人都可以确认这是正确的吗?
编辑:我尝试了各种方式来打开和关闭连接,以及实际查询数据库中using
块中的内容。还尝试在本地托管fp7文件,但仍然没有去:(
答案 0 :(得分:0)
我通过建立持久连接解决了这个问题(声明并打开一次并保持打开状态)。但是我每次想要使用它时都需要检查它是否仍然打开,例如:
Public Sub CheckOpen(ByRef cn As Odbc.OdbcConnection)
If cn.State <> System.Data.ConnectionState.Open Then
cn.Close()
cn.Open()
End If
End Sub
如果您有多个FM数据库文件,那么这可能意味着您需要为每个文件建立一个连接。
旁注:在FMSA上运行的FileMaker的xdbc_listener.exe进程也是漏洞。我们注意到一种模式,一旦它达到不到2GB的内存使用率就会崩溃。所以请记住,该过程可能需要不断重启。