Error: 2006: MySQL server has gone away,该怎么解决

Error: 2006: MySQL server has gone away
我的MySQL安装的是5.6.13版,是源码安装。

我在程序里会把用户上网过程中的流表建一张表存入数据库,但是程序跑一段时间后就出现这个问题。
配置文件里设置 :
wait_timeout=2880000
interactive_timeout=2880000
max_allowed_packet=10M



int init_mysql()
{
    
    char    sql_str[64] = {0};

    if(!MyParm.is_connect_mysql)
    {
        return FALSE;
    }

    sprintf(mysql_server, "%s", inet_htoa(gn_htonl(MyParm.mysql_servIp)));
    mysql = mysql_init(NULL);
    if(mysql == NULL)
    {
        printf("Error: %u: %s\n", mysql_errno(mysql), mysql_error(mysql));
        return FALSE;
    }

    if(mysql_real_connect(mysql, mysql_server, MyParm.mysql_uname, MyParm.mysql_passwd, "test", 0, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
    {
        printf("Error: %u: %s\n", mysql_errno(mysql), mysql_error(mysql));
        return FALSE;
    }

    //smart6pool数据库不存在,创建
    if(mysql_select_db(mysql, DATABASE))
    {
        sprintf(sql_str, "CREATE DATABASE %s", DATABASE);
        
        if(mysql_query(mysql, sql_str))
        {
            printf("Error: %u: %s\n", mysql_errno(mysql), mysql_error(mysql));
            return FALSE;
        }
    }
    
    printf("\n*****connect mysql success!\n");
    
    return TRUE;
}



这是什么原因造成的?
------解决思路----------------------
 原因是长时间没有操作数据库,数据库连接自动断了。我去年也遇到过这个问题,方法是在连接数据库的时候启用MYSQL_OPT_RECONNECT,然后每次执行出错的时候ping一下server,我这里有部分代码:

int Mysql::insertRecord(std::string const &ip,
    std::string const &path,
    std::string const &operation,
    char const *before,
    char const *after)
{
  /**/
  if (!connected_)
    return -2;
  /**/

  std::string path2 = _convertText(path.c_str());
  std::string before2 = _convertText(before);
  std::string after2 = _convertText(after);

  std::string sql =
    "INSERT INTO ZooOp(ip,path,operation,`before`,`after`) VALUES(";
  /* 1) ip */
  sql += "'"; sql += ip; sql += "'";
  /* 2) path */
  sql += ",'"; sql += path2; sql += "'";
  /* 3) operation */
  sql += ",'"; sql += operation; sql += "'";
  /* 4) before */
  sql += ",'"; sql += before2; sql += "'";
  /* 5) after */
  sql += ",'"; sql += after2; sql += "')";

  return _apply(sql);
  /*
  printf("[%s]\n", sql.c_str());
  return 0;
  */
}

int Mysql::_error_handler(std::string const &sql)
{
  do {
    /* 1) ping */
    int ping_ret = mysql_ping(&mysql_);
    if (0 == ping_ret)
      break;
    /* 2) reconnect */
    connect();
    if (connected_)
      break;
    return -1;
  } while (0);

  mysql_query(&mysql_, "set names utf8");
  if (0 != mysql_query(&mysql_, sql.c_str())) {
    printf("mysql: %s\n", mysql_error(&mysql_));
    return -2;
  }
  return 0;
}

int Mysql::_apply(std::string const &sql)
{
  if (0 != mysql_query(&mysql_, sql.c_str()))
    return _error_handler(sql);
  return 0;
}

int Mysql::connect()
{
  if (connected_) {
    mysql_close(&mysql_);
    connected_ = false;
  }

  int retval;
  MYSQL *conn;

  conn = mysql_init(&mysql_);
  if (NULL == conn)
    return -1;

  do {
    conn = mysql_real_connect(&mysql_,
        host_.c_str(), username_.c_str(), password_.c_str(),
        database_.c_str(), port_, NULL, 0);
    if (NULL == conn)
      break;
    char value = 1;
    retval = mysql_options(&mysql_, MYSQL_OPT_RECONNECT, &value);
  } while (0);

  if (NULL == conn 
------解决思路----------------------
 0 != retval)
    mysql_close(&mysql_);
  else
    connected_ = true;

  mysql_query(&mysql_, "set names utf8");

  return connected_ ? 0 : -2;
}

int Mysql::disconn()
{
  if (connected_) {
    mysql_close(&mysql_);
    connected_ = false;
  }
  return 0;
}