Haskell HDBC-ODBC内存泄漏问题?

5
使用Haskell HDBC-ODBC库连接到Microsoft SQL Server时,我遇到了严重的内存泄漏问题。
import           Database.HDBC        
import qualified Database.HDBC.ODBC   as ODBC
import           Control.Monad

-- | Main application.
main :: IO ()
main = dbTest

dbTest :: IO ()
dbTest = do
    let connStr = "DSN=TESTDB;Uid=sa;Pwd=password"
    conn <- ODBC.connectODBC connStr
    replicateM_ 20000 (loop conn)
    disconnect conn
  where
    loop c = do
        result <- getTables c
        commit c
        putStrLn $ show result

运行堆分析器时,我的内存使用保持不变,但Windows报告内存使用增加到接近100MB。

http://i.stack.imgur.com/YkUTW.png

对我来说,这似乎是ODBC驱动程序的Foreign Function接口中出现了内存泄漏问题,但这是我第一次对代码进行剖析,所以我不能确定。是否有人可以提供更深入的见解或修复建议?在循环中调用System.Mem.performGC以尝试清理没有效果。
是否有其他可替代的HDBC-ODBC方案?如果没有,我可能需要学习F#。

随意猜测:移除 commit c 会有什么不同吗? - duplode
不,提交c根本没有任何区别。而且使用quickQuery'而不是getTables也会导致同样的内存泄漏。 - Byron Hillis
1个回答

1
问题出在hdbc-odbc库中。从Git仓库中可以获得新版本v2.5,但是还需要修补hdbc库才能正常工作。
更多细节请参见此错误报告

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接