首页 文章

FileMaker 's ODBC Driver doesn' t发布句柄(内存泄漏)

提问于
浏览
0

经过一整天追踪我的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 未正确处理,因为句柄不断增加!我试图强制垃圾收集,但这没有做任何事情,所以我认为它与驱动程序本身有问题 .

哦,我测试了以相同的方式连接到SQL数据库,正如您所料,没有句柄泄漏......

谁能证实这是正确的?

Edit: 我尝试了各种方法来打开和关闭连接,以及实际查询数据库中的 using 块中的内容 . 还尝试在本地托管fp7文件,但仍然没有去:(

2 回答

  • 1

    FileMaker的ODBC驱动程序非常糟糕,他们承认这一点 . 您还会发现,对于您点击FM服务器的每个查询,您的CPU都会达到接近100%的峰值 . 多年来我一直在关注它 .

    他们的“解决方案”是引入外部SQL源,但这需要你走向另一个方向 . 您可以将VB数据库绑定到FileMaker,然后像实际的FileMaker数据一样访问数据 . 这将允许您在FM服务器上创建脚本,以同步您需要与VB数据库同步的任何表 .

    这不是理想的,但这将是你获得良好表现的最佳选择 .

  • 0

    我通过 Build 持久连接来解决这个问题(声明并打开一次并保持打开状态) . 但是我每次想要使用它时都需要检查它是否仍然打开,例如:

    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数据库文件,那么这可能意味着您需要为每个文件 Build 一个连接 .

    Side Note: FileMaker在FMSA上运行的xdbc_listener.exe进程也是漏洞 . 我们注意到一种模式,一旦它达到不到2GB的内存使用率就会崩溃 . 所以请记住,该过程可能需要不断重启 .

相关问题