对于THIS原因,我想尝试新的东西 - 使用一些系统调用关闭套接字。
有两个词的情况 - 无法设置mysql库的查询超时(C API,请参阅链接获取更多信息),所以我想尝试关闭套接字以查看库的反应。可能这不是一个好主意,但仍想尝试。
这就是我所做的 - 还有另一个启动的线程 - 一个计时器。因此,在特定超时(假设为10秒)之后,如果没有响应,我想关闭套接字。 MYSQL结构具有成员net
,它也是一个结构,并保存fd
。但是当我尝试这样做时:
shutdown( m_pOwner->m_ptrDBConnection->m_mysql.net.fd, SHUT_RDWR );
close( m_pOwner->m_ptrDBConnection->m_mysql.net.fd );
没有任何反应。来自shutdown
和close
的返回值是0
,但套接字仍然打开(因为等待60秒后,DB返回结果,这意味着mysql客户端仍然是等待DB的响应。
有什么想法吗?
由于
编辑 - 是的,有一个正在运行的事务,而我正在尝试关闭套接字。但这是实际的问题 - 我不能终止查询,也不能关闭连接,什么都没有,我不想等待整个超时,即20分30秒,或类似的事情。这就是我正在寻找蛮力的原因..:/
答案 0 :(得分:1)
只是在黑暗中拍摄,但请确保取消/终止任何正在运行的交易。我不熟悉MySQL C API,但我想有一种方法可以检查是否存在任何活动的连接/查询。您可能无法仅仅因为仍有事情正在运行而关闭套接字,并且需要将它们置于某种“已解决”状态,无论是已提交还是已回滚。我会从那里开始看看会发生什么。你真的不想关闭套接字“暴力”风格,如果你还有任何待处理的东西,因为你的数据之后不会处于可靠的“状态” - 你不会知道哪些交易成功,哪些没有,尽管我可以想象,如果连接突然失败,MySQL会回滚任何挂起的事务。
修改强>: 从我通过谷歌搜索“MySQL停止失控查询”发现,共识似乎是要求MySQL使用
终止失控/长时间运行查询的线程KILL thread-id
我想在包含套接字的MySQL数据结构中可以使用线程ID。你可能想试试这个,虽然IIRC这样做需要超级用户权限。
编辑#2 : 显然MySQL提供了一个故障安全机制,它将重新启动一个已关闭的连接,因此强行关闭套接字实际上不会终止查询。一旦你关闭它,MySQL将打开另一个并尝试完成查询。关闭此选项将允许您关闭套接字并导致查询终止。
以下评论显示了如何找到答案,以及其中涉及的思维过程。
答案 1 :(得分:0)
看起来你遇到了TCP等待计时器的问题,这意味着它最终会关闭。 [长话短说]这有点不可避免。还有另外一个讨论。
答案 2 :(得分:0)
据我所知,如果shutdown()
和close()
都返回0,毫无疑问你已经成功关闭了套接字。事实是你可以关闭错误的fd。或者服务器无法正确关闭(如果是这样,这可能被视为服务器的错误:没有理由仍然等待数据传入)。我一直在寻找支持的方式来做到这一点。