我正在尝试连接到MySQL数据库,并使用hdbc和hdbc-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实例。
发布于 2021-11-16 05:29:25
原来问题出在我盲目添加到cabal文件中的cpp-options中。
...
cpp-options: -DDCABAL_BUILD_DEVELOPER
build-depends:
base >=4.14.2.0
...我不知道DDCABAL_BUILD_DEVELOPER是用来做什么的。禁用cpp-options解决了此问题。
发布于 2021-11-15 06:22:00
我猜想当你使用一个内部使用libmysqlclient的ODBC驱动程序时,就会发生这种情况。问题是,libmysqlclient不会重新启动被信号中断的系统调用,而GHC运行时在内部使用信号。
您可以通过查看Database.HDBC.MySQL.withRTSSignalsBlocked来了解如何避免这种情况。简单地说,这个函数阻塞了GHC运行时在执行代码块时使用的SIGALRM和SIGVTALRM。你可以直接使用这个函数,或者如果你不想依赖HDBC-mysql,你也可以直接复制它。
https://stackoverflow.com/questions/69969060
复制相似问题