2011-04-26 6 views
0

J'ai construit une application C# qui met à jour une table DB MySQL toutes les 10 ms. L'application crée un thread distinct pour chaque mise à jour. En utilisant Workbench, je peux voir qu'il y a beaucoup de connexions et pendant un certain temps, cela a été assez réussi. Récemment cependant, je trouve qu'après 2-3 heures d'exécution réussie j'obtiens une exception qui indique "la table xxxx non trouvée". Je possède une lecture et une mise à jour à l'aide Entity Framework, comme suitException MySQL pendant la mise à jour en temps réel

try 
    { 
     u5s = (from u in cxt.universe5s 
       where u.CATEGORY == tval 
       select u).ToList(); 
     . . . 
     u5.PC_CHANGE = chval; 
     cxt.SaveChanges(); 
    } 
    catch (Exception myEx) 
    { 
     //throws my 'table not found' exception here 
    } 

Utilisation de NET 4.0 et MySql 5.5.9. Est-ce que quelqu'un d'autre a une expérience comme celle-ci? Cela pourrait-il être causé par l'épuisement des connexions? Quelle est la meilleure pratique dans ce cas en ce qui concerne la fermeture de la connexion après l'enregistrement des modifications?

Sincèrement Richard

Répondre

1

Cela ressemble à un problème de concurrence. Vous pouvez essayer de verrouiller un seul objet de connexion. Cela réduirait également le stress sur le serveur. Pour plus de détails, voir http://msdn.microsoft.com/en-us/library/c5kehkcz%28v=vs.80%29.aspx.

Espérons que cela aide.

+0

H'mm. Je dépendais de MySQL pour régler les problèmes de concurrence. Je ne voulais pas que mes verrous ralentissent l'accès, mais c'est moins logique maintenant que je génère un thread pour chaque mise à jour. Le lien que vous avez donné est très utile, même si je ne suis pas sûr de ce que vous entendez par verrouillage sur un "objet de connexion". Est-ce le contexte db "cxt" dans mon exemple de code? Donc, est-ce que j'embaquerais tout dans le bloc try avec "lock (cxt) {...}?" La citation MSDN semble mettre l'accent sur l'utilisation d'une variable privée comme un verrou.Je suis un peu ignorant de ce qui sert de verrou – viejo

+0

Si vous aimez ce produit, vous pouvez créer un objet dédié à votre travail: objet privé connectionLock = new object(); – LueTm

+0

OK! Alors c'est juste comme l'exemple que vous avez donné dans le lien.Merci, je vais l'implémenter de cette façon.J'apprécie votre aide.Sincèrement, Richard – viejo

Questions connexes