Haskell HDBC ODBC连接远程MySQL实例时连接被立即释放问题
问题原因
该错误由远程数据库链路的空闲连接回收、ODBC驱动配置不当共同触发,本地连接无网络链路中间设备的回收逻辑,因此不会出现该问题。
修复方案
- 修改ODBC连接字符串配置
新增连接参数避免中间设备回收空闲连接、开启自动重连,你可以在buildMySQLConnectionString的返回结果中追加以下参数:
追加;POOLING=false;TCP_KEEPALIVE=1;CONNECT_TIMEOUT=30;RECONNECT=1;Database=npDatabase=np后可直接删除单独的USE np执行逻辑,减少一次SQL调用。 - 验证连接有效性后再执行业务SQL
connectODBC仅完成TCP握手就会返回连接对象,未实际验证MySQL层的连接可用性,你可以在连接建立后先执行一次心跳查询确认连接存活,修改后的示例代码如下:main :: IO () main = do mysqlSettings <- readMySQLSettings putStr "Connecting to MySQL database..." mysqlConn <- connectODBC $ buildMySQLConnectionString mysqlSettings -- 新增心跳校验逻辑 _ <- run mysqlConn "SELECT 1" [] putStrLn "Connected" putStrLn " Done." - 排查RDS参数配置
检查RDS实例参数组中的wait_timeout、interactive_timeout参数,避免设置过短的空闲连接回收阈值,同时确认RDS安全组允许你的客户端IP的3306端口长时间连接,没有配置短连接强制回收规则。
内容的提问来源于stack exchange,提问作者Microtribute
相关产品推荐
相关产品推荐

