我在许多设备上运行C ++ QT应用程序,需要与MS SQL服务器通信。 我正在使用QODBC3(unixODBC)驱动程序。
SQL连接一旦初始化并连接,然后重复使用。多亏了这个,查询运行得很快(最多20毫秒)。
当没有连接问题时,Everythink工作正常。当网络连接丢失的时间很短时,SQL连接就无法“重新连接”。
我尝试在每次查询尝试之前检查连接是否已打开,但QSqlDatabase::isOpen()
返回true,除非调用close()
。网络问题后它不会改变。
在我的观点中,最好的方法是将ODBC驱动程序中的计时器设置为很短的时间,并尝试在超时关闭时重新连接。但ODBC中的超时设置为cca 15分钟,我无法设置不同的值。
SQLConnection.setConnectOptions("SQL_ATTR_CONNECTION_TIMEOUT=5");
这个命令似乎什么都没改变,我甚至试图在字符串中完成废话,但没有错误或其他什么。
我的下一次尝试是每次在运行查询之前ping服务器,但如果网络连接再次打开,则ping成立并且SQL连接仍然断开。
我的“临时”解决方案是在每次查询之前打开SQL连接,然后关闭它(在打开之前使用ping)。但是这个解决方案可以将每个查询延长到cca 500ms,我对此并不感到高兴。
我身边有四种可能的解决方案: