Maison > développement back-end > C++ > Quel est le moyen le plus rapide d'insérer 4000 enregistrements dans une base de données à l'aide de l'entité Framework dans une transactionScope?

Quel est le moyen le plus rapide d'insérer 4000 enregistrements dans une base de données à l'aide de l'entité Framework dans une transactionScope?

Barbara Streisand
Libérer: 2025-02-02 06:11:14
original
196 Les gens l'ont consulté

What's the Fastest Way to Insert 4000  Records into a Database Using Entity Framework within a TransactionScope?

Framework entité insérer efficacement la méthode des données

Question:

Lorsque vous utilisez TransactionScope pour le traitement des transactions, comment insérer rapidement plus de 4 000 enregistrements dans la base de données?

Réponse:

Pour une grande quantité d'insertion de données (4000 enregistrements), l'efficacité de la méthode est extrêmement faible. La technologie d'optimisation suivante peut améliorer considérablement la vitesse d'insertion:

SaveChanges() One -Time

:
    Une fois tous les enregistrements ajoutés au contexte, l'appel jetable
  • . SaveChanges() Lot : SaveChanges() Après avoir manipulé la quantité spécifiée (par exemple, 100 éléments), appelez
  • une fois.
  • SaveChanges() Contexte de reconstruction: similaire à la méthode par lots, mais libérez le contexte et créez un nouveau contexte pour libérer l'entité supplémentaire après SaveChanges().
  • Désactiver les modifications à tester: Modifications automatiques temporairement désactivées pour tester, définir SaveChanges() sur . SaveChanges()
  • Exemple d'implémentation: Configuration.AutoDetectChangesEnabled Le fragment de code suivant combine la technologie d'optimisation ci-dessus: false
Ce mode atteint l'insertion par lots en traitant plusieurs enregistrements avant d'appeler

. De plus, la libération et la re-création du contexte aideront à supprimer les entités supplémentaires, réduisant ainsi l'utilisation de la mémoire et l'amélioration des performances. Comparaison des performances:

Utilisez ce mode d'optimisation pour insérer 560 000 entités dans les résultats des tests de performance de la base de données:
using (TransactionScope scope = new TransactionScope())
{
    MyDbContext context = null;
    try
    {
        context = new MyDbContext();
        context.Configuration.AutoDetectChangesEnabled = false;

        int count = 0;
        foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
        {
            ++count;
            context = AddToContext(context, entityToInsert, count, 100, true);
        }

        context.SaveChanges();
    }
    finally
    {
        if (context != null)
            context.Dispose();
    }

    scope.Complete();
}

private MyDbContext AddToContext(MyDbContext context,
    Entity entity, int count, int commitCount, bool recreateContext)
{
    context.Set<Entity>().Add(entity);

    if (count % commitCount == 0)
    {
        context.SaveChanges();
        if (recreateContext)
        {
            context.Dispose();
            context = new MyDbContext();
            context.Configuration.AutoDetectChangesEnabled = false;
        }
    }

    return context;
}
Copier après la connexion

SaveChanges() , SaveChanges(): 202 secondes

, : 164 secondes

En revanche, si vous appelez

pour chaque enregistrement, il faudra des heures pour terminer la même opération.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Derniers articles par auteur
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal