2010-09-01 10 views
1

Voici mon extrait de code:serveur MySQL a disparu

query.next(); 
qDebug()<<query.lastError(); 
qlonglong res=query.value(0).toLongLong(); 
qDebug()<<query.lastError(); 

et le journal correspondant je:

Debug: QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away") 
Warning: QSqlQuery::value: not positioned on a valid record 
Debug: QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away") 

Normalement mon programme fonctionne très bien (il fonctionne sur un serveur et accepte les connexions à partir clients), mais chaque matin quand j'ai essayé de le connecter, je reçois des messages ci-dessus.

Quel peut être le problème avec le serveur MySQL?

Répondre

1

De l'MySQL Manual:

La raison la plus courante pour le serveur MySQL a disparu erreur est que le serveur a expiré et a fermé la connexion.

...

Par défaut, le serveur ferme la connexion au bout de huit heures si rien est arrivé. Vous pouvez modifier la limite de temps en définissant la variable wait_timeout lorsque vous démarrez mysqld.

...

Si vous avez un script, il vous suffit de publier à nouveau la requête pour le client de faire une reconnection automatique. Cela suppose que vous avez la reconnexion automatique dans le client activé (qui est la valeur par défaut pour le client de ligne de commande mysql).

Voir this manual page pour plus de détails sur cette erreur.

2

Je sais que c'est vieux mais arrive à être le premier google hit pour "Le serveur MySQL est parti QMYSQL: Impossible d'exécuter la requête".

Il semble que QSqlDatabase :: isOpen() retournera vrai même si nous n'avons plus de connexion. Voici comment je l'attrape:

QSqlDatabase db = QSqlDatabase::database(); 
QSqlQuery query(db); 
QString q = "SELECT * FROM myTable;"; 
if (!query.exec(q)) 
{ 
    int err = query.lastError().number(); 
    if (err == 2006) // Might want to do #2013 here also? 
    { 
     db.close(); 
     if (db.open() && !query.exec(q)) 
     { 
      // handle error here we still failed... 
     } 
    } 
    else 
    { 
     // handle normal query errors here 
    } 
} 

j'ai pu imiter cette situation en redémarrant le serveur avec « redémarrage /etc/init.d/mysql » et continuer à envoyer des requêtes à lui et il jette par la suite cette erreur. Je pense que cela ne devrait pas être changé côté serveur, en fait 8 heures semble extrêmement long pour garder une connexion inactive ouverte.

Questions connexes