2015-09-05 60 views
5

当使用Haskell HDBC-ODBC库连接到Microsoft SQL Server时,我遇到了内存泄漏问题。Haskell HDBC-ODBC内存泄漏?

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 

运行堆分析器给我定的内存使用情况,但窗口报告内存增加到用量的近100MB。

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

对我来说,这似乎是内存泄漏的ODBC驱动程序的外部函数接口,但是这是我第一次配置代码,所以我不能肯定。有没有人有任何进一步的见解或建议的修复?在循环中调用System.Mem.performGC以尝试清理不起作用。

有使用HDBC-ODBC的其他选择吗?如果没有,我可能需要学习F#。

+0

任意猜测:是否删除了'提交C'有所作为? – duplode

+0

不,提交c根本没有任何区别。同样使用quickQuery而不是getTables会导致相同的内存泄漏。 –

回答

1

问题出在hdbc-odbc库中。 Git repo提供了新版本v2.5,但是hdbc库也需要修补才能正常工作。

更多详情请登录this bug report