2013-06-17 7 views
0

Peut-être que ce n'est pas la meilleure source que j'ai jamais écrite, mais c'est pour un formulaire simple qui a pour but d'écrire des données à distance. J'ai deux MySQLConnections à la fois pour une base de données locale. localconnection est utilisé pour lire le DB et updateconnection éditer chaque ligne. Le problème est que lorsque j'essaie de mettre à jour la base de données, le programme déclenche un timeout et il plante. Je pense que le problème est généré par le tandis que la boucle. Mon intention est de lire une seule ligne, de la publier sur le serveur et de la mettre à jour si le serveur renvoie l'état 200.MySQL ExecuteNonQuery prend trop de temps

Voici le code, il échoue sur updateConnection.ExcecuteNonQuery();

// Local Database here. 
    localCommand.Parameters.Clear(); 
    // 0 - Grab unsent emails 
    string receivedMessages = "SELECT * FROM EMAIL WHERE HASSENT = 0"; 
    // Update connection init START 
    string updateConnectionString = "Server=" + this.localServer + ";Database=" + this.localDatabase + ";Uid=" + this.localUser + ";Pwd=" + this.localpassword; 
    MySqlConnection updateConnection = new MySqlConnection(updateConnectionString); 
    updateConnection.Open(); 
    MySqlTransaction transaction = updateConnection.BeginTransaction(); 
    MySqlCommand updateCommand = new MySqlCommand(); 
    // Update connection init END 
    localCommand.Connection = localConnection; 
    localCommand.Prepare(); 
    try 
    { 
     localCommand.CommandText = receivedMessages; 
     MySqlDataReader reader = localCommand.ExecuteReader(); 
     while (reader.Read()) // Local db read 
     { 
     String EID = reader.GetString(0); 
     String message = reader.GetString(3); 
     String fromEmail = reader.GetString(6); 
     String toEmail= reader.GetString(12); 
     // 1 - Post Request via HttpWebRequest 
     var receivedResponse = JObject.Parse(toSend.setIsReceived(fromEmail, message, toEmail)); 
     // 2 - Read the JSON response from the server 
     if ((int)receivedResponse["status"] == 200) 
     { 
      string updateInbox = "UPDATE EMAIL SET HASSENT = 1 WHERE EMAILID = @EID"; 
      MySqlParameter EMAILID = new MySqlParameter("@EID", MySqlDbType.String); 
      EMAILID.Value = EID; // We use the same fetched above 
      updateCommand.Connection = updateConnection; 
      updateCommand.Parameters.Add(IID_value); 
      updateCommand.Prepare(); 
      updateCommand.CommandText = updateInbox; 
      updateCommand.ExecuteNonQuery(); 
     } 
     else 
     { 
      // Notice the error.... 
     } 
    } 
    } 
    catch (MySqlException ex) 
    { 
    transaction.Rollback(); 
    // Notice... 

    } 
    finally 
    { 
    updateConnection.Close(); 
    } 

Répondre

1

Il est difficile de dire exactement ce qui ne va pas ici sans faire quelques expériences.

Il y a deux possibilités, cependant. Tout d'abord, votre programme semble fonctionner sur un serveur Web, ce qui le contraint à fonctionner pendant une durée limitée. Mais, vous parcourez un ensemble de résultats potentiellement important, et faites des choses d'une durée incontrôlable pour chaque élément de ce jeu de résultats. Deuxièmement, vous lisez un jeu de résultats ligne par ligne à partir du serveur MySQL, et avec une connexion différente, essayez de mettre à jour les tables derrière ce jeu de résultats. Cela peut entraîner un blocage, dans lequel le serveur MySQL bloque l'une de vos requêtes de mise à jour jusqu'à ce que la requête de sélection se termine, empêchant ainsi l'achèvement de la requête de sélection.

Comment guérir cela? Tout d'abord, essayez de gérer un nombre fixe et petit de lignes dans chaque invocation de ce code. Modifiez votre requête de sélection à

SELECT * FROM EMAIL WHERE HASSENT = 0 LIMIT 10 

et vous gérer à chaque fois dix enregistrements. Ensuite, lisez l'ensemble des résultats de la requête de sélection dans une structure de données, puis faites une boucle sur les éléments. En d'autres termes, n'insérez pas les mises à jour dans la sélection. Troisièmement, réduisez la quantité de données que vous gérez en remplaçant SELECT * par SELECT field, field, field.

+0

Oui, il semble que le problème est la limite, même si j'ai une requête 35/40 ... peut-être que je dois optimiser le code .. –

+0

Peu importe si vous optimisez ce code; c'est déjà plutôt bien. Votre problème est que vous envoyez chaque enregistrement à un service Web. Les services Web prennent un temps imprévisible pour effectuer leur traitement, il n'y aura donc aucune garantie. Si j'étais vous, je ferais ceux-ci un, deux ou trois à la fois. –