Le traitement des Milliers de SqlCommands à l'aide d'un SqlTransaction Causes de la Mémoire Exception
-
12-12-2019 - |
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.
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
puis-je traiter que de nombreux états à l'intérieur d'une seule opération?
Vous avez ci-dessous les options pour ce faire...
- Bulk insert et oprate les enregistrements dans
Stored Proc
. - Préparer
XML
et de l'envoyer à la chaîne dansDatabase
. - 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())
{
}