3

我正在尝试连接到 MySQL 数据库并使用和运行 SQLhdbc查询hdbc-odbc

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 实例中。

4

2 回答 2

1

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

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

于 2021-11-15T06:22:00.260 回答
0

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

    ...
   
    cpp-options: -DDCABAL_BUILD_DEVELOPER

    build-depends:
        base >=4.14.2.0
        ...

我不知道DDCABAL_BUILD_DEVELOPER是用来做什么的。禁用已cpp-options修复的问题。

于 2021-11-16T05:29:25.257 回答