首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为远程MySQL实例立即释放haskell `hdbc` ODBC连接

为远程MySQL实例立即释放haskell `hdbc` ODBC连接
EN

Stack Overflow用户
提问于 2021-11-15 03:06:43
回答 2查看 72关注 0票数 3

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

代码语言:javascript
复制
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" [])时,我得到以下错误。

代码语言:javascript
复制
SqlError {seState = "", seNativeError = -1, seErrorMsg = "Tried to use a disposed ODBC Connection handle"}

据我所知,该错误似乎表明连接在创建后立即被释放。此问题仅在连接到远程数据库(在本例中为Amazon RDS )时发生,并且不适用于我的本地MySQL实例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-16 05:29:25

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

代码语言:javascript
复制
    ...
   
    cpp-options: -DDCABAL_BUILD_DEVELOPER

    build-depends:
        base >=4.14.2.0
        ...

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

票数 0
EN

Stack Overflow用户

发布于 2021-11-15 06:22:00

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69969060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档