haskell `hdbc` ODBC 连接立即为远程 MySQL 实例处理掉
haskell `hdbc` ODBC connection gets disposed of immediately for remote MySQL instance
连接到 MySQL 数据库和 运行 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
了解如何避免这种情况。简单地说,这个函数块 SIGALRM
和 SIGVTALRM
是 GHC 运行时在执行代码块时使用的。可以直接使用这个函数,也可以不依赖HDBC-mysql
.
直接复制
原来问题出在 cpp-options
我盲目添加到 cabal
文件中。
...
cpp-options: -DDCABAL_BUILD_DEVELOPER
build-depends:
base >=4.14.2.0
...
我不知道DDCABAL_BUILD_DEVELOPER
有什么用。禁用 cpp-options
解决了这个问题。
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
了解如何避免这种情况。简单地说,这个函数块 SIGALRM
和 SIGVTALRM
是 GHC 运行时在执行代码块时使用的。可以直接使用这个函数,也可以不依赖HDBC-mysql
.
原来问题出在 cpp-options
我盲目添加到 cabal
文件中。
...
cpp-options: -DDCABAL_BUILD_DEVELOPER
build-depends:
base >=4.14.2.0
...
我不知道DDCABAL_BUILD_DEVELOPER
有什么用。禁用 cpp-options
解决了这个问题。