Penyelesaian masalah "ExecuteReader memerlukan sambungan terbuka dan tersedia" dalam ASP.NET dan MSSQL
Apabila bekerja dengan pangkalan data ASP.NET dan MSSQL, ralat "ExecuteReader memerlukan sambungan terbuka dan tersedia" sering timbul semasa akses serentak. Ini biasanya berpunca daripada menggunakan sambungan statik dalam kelas pangkalan data berpusat. Pendekatan ini, walaupun kelihatan mudah, mewujudkan kesesakan prestasi yang signifikan dan risiko pengecualian disebabkan oleh perbalahan sumber.
Memahami penyatuan sambungan dan perangkap sambungan statik
ado.net memanfaatkan penyatuan sambungan untuk mengoptimumkan interaksi pangkalan data. Dengan mengekalkan sekumpulan sambungan aktif, ia mengelakkan overhead berulang kali mewujudkan sambungan baru. Walau bagaimanapun, sambungan statik memperkenalkan kecacatan kritikal: Setiap benang yang cuba mengakses objek sambungan bersama memerlukan kunci. Dalam persekitaran ASP.NET multithreaded, ini membawa kepada kemerosotan prestasi yang signifikan dan kebuntuan yang berpotensi.
Kesan negatif pengurusan sambungan statik:
Amalan terbaik yang disyorkan untuk akses pangkalan data yang cekap:
untuk mengurangkan isu -isu ini dan memastikan prestasi yang optimum, mengamalkan amalan terbaik berikut:
using
pernyataan menjamin pelupusan sumber yang betul, secara automatik menutup dan melepaskan sambungan. using
Contoh: peningkatan kaedah retrievePromotion
yang lebih baik yang menggabungkan amalan terbaik ini: retrievePromotion
<code class="language-csharp">public Promotion retrievePromotion(int promotionID) { Promotion promo = null; string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MainConnStr"].ConnectionString; using (SqlConnection connection = new SqlConnection(connectionString)) { string queryString = "SELECT PromotionID, PromotionTitle, PromotionURL FROM Promotion WHERE PromotionID=@PromotionID"; using (SqlDataAdapter da = new SqlDataAdapter(queryString, connection)) { DataTable tblPromotion = new DataTable(); da.SelectCommand.Parameters.AddWithValue("@PromotionID", promotionID); //More efficient parameter addition try { connection.Open(); da.Fill(tblPromotion); if (tblPromotion.Rows.Count > 0) { DataRow promoRow = tblPromotion.Rows[0]; promo = new Promotion { promotionID = promotionID, promotionTitle = promoRow.Field<string>("PromotionTitle"), promotionUrl = promoRow.Field<string>("PromotionURL") }; } } catch (Exception ex) { // Log the exception or re-throw as appropriate. Consider using a logging framework. throw; // Re-throw to allow higher-level handling } } } return promo; }</code>
Atas ialah kandungan terperinci Bagaimana untuk memperbaiki 'ExecuteReader memerlukan kesilapan terbuka dan tersedia' dalam ASP.NET semasa mengendalikan sambungan pangkalan data serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!