【问题标题】:MySQL Error 2006: MySQL server has gone away (Got an error reading communication packets)MySQL 错误 2006:MySQL 服务器已消失(读取通信数据包时出错)
【发布时间】:2016-06-30 17:28:58
【问题描述】:

我目前正在开发一个 C++ 项目,该项目需要连接到存储在 LAN 网络上另一台计算机上的 MySQL 数据库。

连接到数据库工作正常,我可以运行一些查询没问题,但在循环中迭代结果的同一点(在第三次迭代中)数据库连接关闭,我给出的错误是:

MySQL server has gone away.

当我检查服务器日志时,我看到:

Aborted connection to db <user details> (Got an error reading communication packets)

在搜索了这个网站以及谷歌之后,很多帖子都建议增加几个缓冲区和超时变量:

innodb_log_buffer_size    = 32M
innodb_log_file_size      = 2047M
innodb_fast_shutdown      = 0

max_connections           = 400
connect_timeout           = 300
net_read_timeout          = 6000
net_write_timeout         = 6000
wait_timeout              = 9999999999
interactive_timeout       = 9999999999

max_allowed_packet        = 500M
net_buffer_length         = 500M

我正在像这样迭代结果:

while( this->pRes->next() ) // pRes is a pointer to a sql::ResultSet instance
{

    ...

还有其他几个人遇到了这个问题,但对他们有用的解决方案对我来说并不成功。问题的链接在这里:

ERROR 2006 (HY000): MySQL server has gone away

MySQL error 2006: mysql server has gone away

https://dba.stackexchange.com/questions/40899/mysql-error-reading-communication-packets

https://www.percona.com/blog/2016/05/16/mysql-got-an-error-reading-communication-packet-errors/

http://dev.mysql.com/doc/refman/5.7/en/communication-errors.html

注意事项:

  • 关闭连接并尝试重新打开它并不能解决问题。调用 sql::Connection::reconnect 也不起作用。

  • 我已经为变量尝试了几个值,因为不同的帖子建议不同的值,每次我更改一些东西来尝试它时,我都重新启动了服务器。

  • 服务器版本为5.7,MySQL Connector/C++版本为1.1.7

  • 有更多指向人们发布相同问题的帖子的链接,但通常他们只是建议我列出的变量具有不同值的相同内容(尝试了所有但没有工作)。

  • 托管服务器的机器是 Windows 10 Pro x64,我正在开发的机器也是 Windows 10 x64。

  • 我的开发环境是 Visual Studio 2015 Community

  • 两台机器上的防火墙都被禁用,并且路由器上的相关tcp端口已经转发到运行服务器的机器上

如果您需要更多信息,请发表评论,我会尽我所能。

【问题讨论】:

    标签: c++ mysql


    【解决方案1】:

    此问题的答案在问题中不可见。

    当我从数据库中读取数据时,我正在创建一个对象的实例并将结果从数据库传递给对象构造函数,在检查该对象是否是列表中保存的副本时,我会调用 '如果它是重复的,则删除',而不是将实例添加到列表中。

    在对象内部,我做了一些套接字编程,为了保持整洁,在析构函数中调用了“WSACleanup”,众所周知,这是在调用“删除”时推断出来的,所以每当发现重复时“依次调用 WSACleanup' 来关闭与数据库的连接,从而导致我遇到的问题。

    解决问题有两个答案:

    1. 将对 WSACleanup 的调用移至应用程序生命周期的末尾

    2. 每次发现重复时重建整个数据库连接

    我选择了解决方案 1。

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2011-12-18
      • 2011-08-28
      • 2012-05-15
      • 2020-04-12
      相关资源
      最近更新 更多