0

在我的 VB.NET 项目中追踪内存泄漏一整天后,我将原因追溯到 FileMaker 的 ODBC 驱动程序的错误!

要重现,您需要一个可以连接的数据库(我的数据库托管在 Server Advanced 11.0.3 上,但您也可以在本地托管它),以及在 PC 上注册/安装的 ODBC 驱动程序(我测试了 11.3 和 12.0 版本,以及最新的 12.2)。

启动一个新的 VB.NET WinForms 项目,在表单中添加一个按钮并将此代码粘贴到按钮的单击事件中:

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 数据库,正如你所料,没有句柄泄漏......

谁能确认这是正确的?

编辑:我尝试了各种打开和关闭连接的方法,以及实际在数据库中查询using块中的某些内容。还尝试在本地托管 fp7 文件,但仍然不行:(

4

2 回答 2

1

FileMaker 的 ODBC 驱动程序很糟糕,他们承认这一点。您还会发现,每次访问 FM 服务器时,您的 CPU 都会飙升至近 100%。多年来,我一直在抱怨他们。

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

这并不理想,但这将是您获得良好性能的最佳选择。

于 2013-01-07T08:47:50.857 回答
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 以下,它就会崩溃。因此请记住,该过程可能需要不断重新启动。

于 2013-01-08T02:35:22.467 回答