我有这个Linux二进制应用程序,它建立了与本地MySQL服务器的2个持久连接(使用127.0.0.1作为主机名)。
这样的应用程序每15分钟必须执行2000行单insert
(请不要质疑数据库设计),但是在某个点上连接B“挂起”将近20秒在向MySQL发送第n个insert
语句之后;通过wireshark查看tcp转储,事实证明,在这种情况下,MySQL使用简单的ACK数据包进行响应,没有任何MySQL协议特定部分,但确实没有PSH标志,因此它不被识别为正确的MySQL“响应OK”消息
有人可以说明MySQL服务器使用简单的ACK TCP数据包响应请求查询数据包而没有PSH标志的原因吗?
答案 0 :(得分:1)
TCP ack处于TCP级别,而不是应用程序(mysql协议)级别。
TCP堆栈ACK是您发送的数据。这意味着它已成功接收数据,并可能将数据传递给用户(在您的情况下为mysql服务器)。
所以MySQL服务器正在忙着执行你的查询,当它完成执行查询时它将返回一个应用程序响应(你正在寻找的MySQL“响应OK”消息)(在你的情况下由于某种原因或者另一个需要20秒) - 可能存在I / O争用,也许一些其他长时间运行的查询持有锁,或者由于您的查询需要完成其他一些繁重的工作。