Le traitement des Milliers de SqlCommands à l'aide d'un SqlTransaction Causes de la Mémoire Exception

StackOverflow https://stackoverflow.com//questions/11675430

Question

J'ai écrit une coutume fonction de réplication dans un standard C# application windows forms avec un Serveur SQL server 2008 Express de la base de données.Il tire essentiellement un ensemble d'instructions sql qui doivent être exécutées sur une base de données d'abonnés.Sur une actualisation complète cela peut fonctionner jusqu'à 200k+ les instructions qui doivent être exécutées.

J'ai du traitement de ces états à l'intérieur d'un bloc de code comme indiqué ci-dessous:

using (SqlConnection connection = ConnectionManager.GetConnection())
{
     connection.Open();

     SqlTransaction transaction = connection.BeginTransaction();

     // Process 200k+ Insert/Update/Delete statements using SqlCommands

     transaction.Commit
}

Ce que je trouve, c'est que mes applications l'utilisation de la mémoire reste assez stable, autour de 40 mo pour la première 30k consolidés.Après quoi, elle semble soudainement saut à environ 300mo et pousse ensuite jusqu'à ce que je frappe un dépassement de mémoire exception.

C'est la méthode que j'utilise encore possible, je peut traiter que de nombreux états à l'intérieur d'une seule opération?Je suppose que je devrais être capable de faire cela.Si il ya une meilleure façon que j'aimerais ici.J'ai besoin de ce transactionnelle sinon une réplication partielle seraient le résultat d'une fracture de la base de données.

Merci.

EDIT:

Après le redémarrage de mon ordinateur, j'ai réussi à faire une bonne 200k+ de réplication à passer.Même s'il ne l'est à un point de grandir dans l'utilisation de la mémoire à 1,4 Go une fois la réplication terminée l'utilisation de la mémoire a chuté jusqu'à 40 mo.Ce qui m'amène à conclure que quelque chose à l'intérieur de ma boucle qui traite les commandes est à l'origine de la croissance de mémoire peut-être.

Était-ce utile?

La solution

Êtes-vous Disposing vos formulaires et les jetables contrôles avant la fermeture?

Enveloppez tous les Jetables objets à l'Aide de Déclaration.Cliquez ici pour plus de détails


Ne pas ouvrir/fermer la Connexion, encore et encore, au lieu d'envoyer les données à la base de données dans une seule Transaction.Cliquez ici pour plus de détails


Encore votre application est maintenant tooo beaucoup de mémoire, puis vous avez besoin d'un Médecin, comme la Red Gate Fourmis Memory Profiler.Cliquez ici pour voir plus de détails

enter image description here


puis-je traiter que de nombreux états à l'intérieur d'une seule opération?

Vous avez ci-dessous les options pour ce faire...

  1. Bulk insert et oprate les enregistrements dans Stored Proc.
  2. Préparer XML et de l'envoyer à la chaîne dans Database.
  3. Envoyer la Lecture seule DataTable dans Sql Server par le biais de procédures Stockées

Exemple De Procédure Stockée

Begin Try
    Set NoCount ON
    Set XACT_Abort ON
    Begin TRan
        --Your queries
    Commit Tran

Begin Tran

Begin Catch
    Rollback Tran
End Catch

Assurez-vous de Dispose les objets une fois n'est pas utilisé.


Il devrait ressembler à ceci

using (SqlConnection connection = new SqlConnection())
{
    connection.Open();
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        transaction.Commit();
    }
}

Avez-vous vérifier la SqlCommand aussi?

using (SqlCommand cmd = new SqlCommand())
{
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top