Rumah > pembangunan bahagian belakang > C++ > Apakah cara terpantas untuk memasukkan 4000 rekod ke dalam pangkalan data menggunakan kerangka entiti dalam transaksi yang tidak dapat diselesaikan?

Apakah cara terpantas untuk memasukkan 4000 rekod ke dalam pangkalan data menggunakan kerangka entiti dalam transaksi yang tidak dapat diselesaikan?

Barbara Streisand
Lepaskan: 2025-02-02 06:11:14
asal
243 orang telah melayarinya

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

rangka kerja entiti dengan cekap memasukkan kaedah data

<:> Soalan:

Apabila menggunakan Transactionscope untuk pemprosesan transaksi, bagaimana dengan cepat memasukkan lebih daripada 4,000 rekod ke dalam pangkalan data?

Jawapan:

Untuk sejumlah besar penyisipan data (4000 rekod), kecekapan kaedah sangat rendah. Teknologi pengoptimuman berikut dapat meningkatkan kelajuan penyisipan dengan ketara:

SaveChanges() one -time

:
    Selepas semua rekod ditambah kepada konteks, panggilan pakai buang
  • . SaveChanges() batch : SaveChanges() selepas mengendalikan kuantiti yang ditentukan (contohnya, 100 item), hubungi
  • sekali.
  • SaveChanges() Konteks Rekonstruksi: Sama seperti kaedah batch, tetapi lepaskan konteks dan buat konteks baru untuk melepaskan entiti tambahan selepas SaveChanges().
  • Lumpuhkan Perubahan ke Ujian: Perubahan automatik yang dilumpuhkan sementara untuk menguji, set SaveChanges() ke . SaveChanges()
  • Contoh Pelaksanaan Contoh:
  • Serpihan kod berikut menggabungkan teknologi pengoptimuman di atas: Configuration.AutoDetectChangesEnabled false
  • Mod ini mencapai penyisipan batch dengan memproses beberapa rekod sebelum memanggil
. Di samping itu, pelepasan dan pencegahan semula konteks akan membantu menghapuskan entiti tambahan, dengan itu mengurangkan penggunaan memori dan meningkatkan prestasi.

Perbandingan prestasi:

Gunakan mod pengoptimuman ini untuk memasukkan 560,000 entiti ke dalam keputusan ujian prestasi pangkalan data:

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;
}
Salin selepas log masuk

, SaveChanges(): 202 saat SaveChanges()

,

: 164 saat

Sebaliknya, jika anda memanggil

untuk setiap rekod, ia akan mengambil masa berjam -jam untuk menyelesaikan operasi yang sama.

Atas ialah kandungan terperinci Apakah cara terpantas untuk memasukkan 4000 rekod ke dalam pangkalan data menggunakan kerangka entiti dalam transaksi yang tidak dapat diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan