【问题标题】:FileMaker's ODBC Driver doesn't release Handles (memory leak)FileMaker 的 ODBC 驱动程序不释放句柄(内存泄漏)
【发布时间】:2012-11-22 12:56:07
【问题描述】:

在我的 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 文件,但仍然不行:(

【问题讨论】:

  • 您是否尝试过同样的方式来处理您的连接?至少 MSDN 说您应该始终处理打开的 ODBCConnection 或将其包装在 using
  • 忘记最后的评论,我只是瞎了:(
  • 谢谢@igrimpe,是的,这是我尝试的第一件事,这让我觉得它必须是驱动程序......

标签: vb.net memory-leaks odbc driver filemaker


【解决方案1】:

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

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

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

【讨论】:

  • 问题是我们使用 FileMaker 作为另一个应用程序的后端。一个坏主意:(
  • 使用外部 SQL 源是否会出现任何缓存问题?我们发现 FileMaker 缓存外部 ODBC 表并且非常不可靠。如果 ESS 是这种情况,我很感兴趣......
  • 您只需要确保在同步数据的脚本中添加刷新步骤。
【解决方案2】:

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

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 以下,它就会崩溃。所以请记住,该过程可能需要不断重启。

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 2013-09-06
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2011-01-27
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多