haskell`hdbc`ODBC连接会立即被远程MySQL实例处理掉



我正在尝试连接到MySQL数据库,并使用hdbchdbc-odbc运行SQL查询

main :: IO ()
main = do
mysqlSettings <- readMySQLSettings
putStr "Connecting to MySQL database..."
mysqlConn <- connectODBC $ buildMySQLConnectionString mysqlSettings
putStrLn "Connected"
_ <- run mysqlConn "USE np" []
putStrLn " Done."

数据库连接良好,但随后当它运行SQL查询(_ <- run mysqlConn "USE np" [](时,我会得到以下错误。

SqlError {seState = "", seNativeError = -1, seErrorMsg = "Tried to use a disposed ODBC Connection handle"}

据我所知,这个错误似乎表明连接一创建就会立即释放。这个问题只发生在连接到远程数据库(本例中为Amazon RDS(时,而不适用于我的本地MySQL实例。

我想当您使用内部使用libmysqlclient的ODBC驱动程序时会发生这种情况。问题是,libmysqlclient不会重新启动被信号中断的系统调用,GHC运行时在内部使用信号。

您可以通过查看Database.HDBC.MySQL.withRTSSignalsBlocked来了解如何避免这种情况。简单地说,这个函数会阻止GHC运行时在执行代码块时使用的SIGALRMSIGVTALRM。你可以直接使用这个函数,如果你不想依赖HDBC-mysql,也可以直接复制它。

发现问题出在我盲目添加到cabal文件的cpp-options中。

...

cpp-options: -DDCABAL_BUILD_DEVELOPER
build-depends:
base >=4.14.2.0
...

我不知道DDCABAL_BUILD_DEVELOPER是干什么用的。禁用cpp-options解决了此问题。

相关内容

  • 没有找到相关文章

最新更新