Pertanyaan SqlConnection dengan pemrograman Paralel


Ini adalah kode saya yang ada yang menyimpan beberapa data ke beberapa tabel

using (SqlConnection conn = new SqlConnection("myConnString"))
{
   DoWork1(conn);
   DoWork2(conc);
   DoWork3(conn);
}

Untuk mempercepat kode saya sehingga saya mencoba untuk mendapatkan dukungan .net TPL dan saya mengubah kode saya seperti di bawah ini

using (SqlConnection conn = new SqlConnection("myConnString"))
{
   ParallelOptions pw = new ParallelOptions();
   pw.MaxDegreeOfParallelism = Environment.ProcessorCount;

   Parallel.Invoke(pw,()=> DoWork1(conn),()=> DoWork2(conc),()=> DoWork3(conn));
} 

Tapi ini melemparkan saya koneksi internal kesalahan fatal pengecualian dari ExecuteNonQuery () metode di lapisan akses data saya. Apakah pendekatan paralel saya salah?


5
2018-04-20 05:46


asal


Jawaban:


Nah, ada cara yang bisa dilakukan berpotensi dibuat untuk bekerja menggunakan MARS - tetapi saya akan menyarankan pendekatan yang berbeda. (Saya tidak tahu apakah MARS mendukung menggunakan koneksi yang sama di beberapa utas, meskipun itu memungkinkan beberapa operasi bersamaan.)

Alih-alih mencoba menggunakan kembali satu koneksi di semua tugas paralel, buat setiap tugas membuka (dan menutup) koneksi untuk dirinya sendiri, dan biarkan penggabungan koneksi menangani sisi efisiensi itu. Itu praktik terbaik umum di NET. Apakah Anda menggunakan paralelisme atau tidak: buka koneksi, lakukan beberapa pekerjaan, tutup koneksi.


8
2018-04-20 06:04



Saya tidak punya reputasi untuk berkomentar tetapi sepertinya saya bisa menjawab. Itu agak aneh Anyway komentar saya adalah bahwa tabel sementara per sambungan, sehingga membuka koneksi baru berarti Anda tidak dapat melihat tabel sementara yang dibuat oleh tugas lain.

Tabel sementara global mungkin jawabannya tetapi Anda juga harus a) gunakan tabel temp global tunggal dan partisi data menggunakan beberapa kunci b) menggunakan tabel bernama unik yang berarti sql dinamis

Semua sedikit berantakan benar-benar


0
2017-08-24 16:40