ฉันจะแก้ไขปัญหาพูลการเชื่อมต่อระหว่าง ASP.NET และ SQL Server ได้อย่างไร


211

ไม่กี่วันที่ผ่านมาเราเห็นข้อความแสดงข้อผิดพลาดนี้ในเว็บไซต์ของเรามากเกินไป:

"หมดเวลาหมดอายุแล้วช่วงเวลาหมดเวลาก่อนที่จะได้รับการเชื่อมต่อจากพูลซึ่งอาจเกิดขึ้นเนื่องจากการเชื่อมต่อพูลทั้งหมดถูกใช้งานอยู่และถึงขนาดสูงสุดของพูล"

เราไม่ได้เปลี่ยนแปลงอะไรในรหัสของเราในขณะที่ ฉันแก้ไขรหัสเพื่อตรวจสอบการเชื่อมต่อที่เปิดอยู่ซึ่งไม่ได้ปิด แต่พบว่าทุกอย่างเรียบร้อยดี

  • ฉันจะแก้ปัญหานี้ได้อย่างไร

  • ฉันจำเป็นต้องแก้ไขกลุ่มนี้หรือไม่?

  • ฉันจะแก้ไขจำนวนการเชื่อมต่อสูงสุดของพูลนี้ได้อย่างไร

  • มูลค่าที่แนะนำสำหรับเว็บไซต์ที่มีอัตราการเข้าชมสูงคือเท่าใด


ปรับปรุง:

ฉันต้องแก้ไขบางอย่างใน IIS หรือไม่

ปรับปรุง:

ฉันพบว่าจำนวนการเชื่อมต่อที่ใช้งานอยู่ที่ใดก็ได้ตั้งแต่ 15 ถึง 31 และฉันพบว่าจำนวนสูงสุดของการเชื่อมต่อที่กำหนดค่าในเซิร์ฟเวอร์ SQL คือมากกว่า 3200 การเชื่อมต่อเป็น 31 มากเกินไปหรือฉันควรแก้ไขบางอย่างในการกำหนดค่า ASP.NET ?


ขนาดพูลสูงสุดเริ่มต้นคือ 100 ถ้าฉันจำได้อย่างถูกต้อง เว็บไซต์ส่วนใหญ่ไม่ใช้การเชื่อมต่อมากกว่า 50 ครั้งภายใต้ภาระงานหนัก - ขึ้นอยู่กับว่าแบบสอบถามของคุณใช้เวลานานเท่าใด การแก้ไขระยะสั้นในสตริงการเชื่อมต่อ: พยายามตั้งค่าที่สูงกว่าในสตริงการเชื่อมต่อของคุณ: "ขนาดพูลสูงสุด = ... "
splattne

เท่าไหร่ ทำให้เป็นตัวอย่าง 200
Amr Elgarhy

3
ฉันคิดว่าคุณควรค้นหาสิ่งที่ทำให้เกิดปัญหา ข้อความค้นหาของคุณ (หรือบางรายการ) ยาวเกินไปหรือไม่
splattne

อาจจะ thats เหตุผลที่แท้จริงแบบสอบถามซึ่งคือการที่จะใช้เวลามากในการดำเนินการที่ฉันจะค้นหาในการที่ขอบคุณ
Amr Elgarhy

1
ฉันหวังว่าคุณจะพบปัญหา คำแนะนำ: หากคุณใช้ SQL Server ลอง "SQL Profiler" และค้นหาข้อความค้นหาแบบยาว: sql-server-performance.com/articles/per/…
splattne

คำตอบ:


218

ในกรณีส่วนใหญ่ปัญหาการรวมการเชื่อมต่อเกี่ยวข้องกับ "การรั่วไหลของการเชื่อมต่อ" แอปพลิเคชันของคุณอาจไม่ปิดการเชื่อมต่อฐานข้อมูลอย่างถูกต้องและสม่ำเสมอ เมื่อคุณเปิดการเชื่อมต่อไว้การเชื่อมต่อจะยังคงถูกบล็อกจนกว่าตัวรวบรวมขยะ. NET จะปิดการเชื่อมต่อให้กับคุณโดยการเรียกFinalize()วิธีการของพวกเขา

คุณต้องการให้แน่ใจว่าคุณกำลังปิดการเชื่อมต่อจริง ๆ ตัวอย่างเช่นรหัสต่อไปนี้จะทำให้เกิดการรั่วไหลของการเชื่อมต่อหากรหัสระหว่าง.OpenและCloseส่งข้อยกเว้น:

var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();                

วิธีที่ถูกต้องคือ:

var connection = new SqlConnection(ConnectionString);
try
{
     connection.Open();
     someCall (connection);
}
finally
{
     connection.Close();                
}

หรือ

using (SqlConnection connection = new SqlConnection(connectionString))
{
     connection.Open();
     someCall(connection);
}

เมื่อฟังก์ชั่นของคุณส่งคืนการเชื่อมต่อจากวิธีการเรียนให้แน่ใจว่าคุณแคชในประเทศและเรียกCloseวิธีการ คุณจะรั่วไหลของการเชื่อมต่อโดยใช้รหัสนี้ตัวอย่างเช่น:

var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close(); 

การเชื่อมต่อที่ส่งคืนจากสายแรกไปยังgetConnection()ไม่ถูกปิด แทนที่จะปิดการเชื่อมต่อของคุณบรรทัดนี้จะสร้างขึ้นมาใหม่และพยายามที่จะปิด

หากคุณใช้SqlDataReaderหรือOleDbDataReaderปิดให้ปิด แม้ว่าการปิดการเชื่อมต่อนั้นจะเป็นการหลอกลวง แต่ก็พยายามปิดวัตถุเครื่องอ่านข้อมูลของคุณอย่างชัดเจนเมื่อคุณใช้งาน


บทความนี้ " ทำไม Connection Pool Overflow? " จากนิตยสาร MSDN / SQL อธิบายรายละเอียดจำนวนมากและแนะนำกลยุทธ์การดีบัก:

  • เรียกใช้หรือsp_who sp_who2โพรซีเดอร์ที่เก็บระบบเหล่านี้ส่งคืนข้อมูลจากsysprocessesตารางระบบที่แสดงสถานะและข้อมูลเกี่ยวกับกระบวนการทำงานทั้งหมด โดยทั่วไปคุณจะเห็น ID กระบวนการของเซิร์ฟเวอร์ (SPID) ต่อการเชื่อมต่อ หากคุณตั้งชื่อการเชื่อมต่อของคุณโดยใช้อาร์กิวเมนต์ชื่อแอปพลิเคชันในสตริงการเชื่อมต่อการเชื่อมต่อที่ใช้งานได้จะหาได้ง่าย
  • ใช้ SQL Server Profiler กับTSQL_ReplayเทมเพลตSQLProfiler เพื่อติดตามการเชื่อมต่อที่เปิดอยู่ หากคุณคุ้นเคยกับ Profiler วิธีนี้จะง่ายกว่าการใช้การลงคะแนนโดยใช้ sp_who
  • ใช้การตรวจสอบประสิทธิภาพเพื่อตรวจสอบพูลและการเชื่อมต่อ ฉันหารือเกี่ยวกับวิธีนี้ในอีกสักครู่
  • ตรวจสอบเคาน์เตอร์วัดประสิทธิภาพในรหัส คุณสามารถตรวจสอบสถานะของพูลการเชื่อมต่อของคุณและจำนวนการเชื่อมต่อที่สร้างขึ้นโดยใช้รูทีนเพื่อแยกตัวนับหรือโดยใช้ตัวควบคุม. NET PerformanceCounter ใหม่

4
การแก้ไขเล็กน้อย: GC จะไม่เรียกวิธีการกำจัดของวัตถุเพียงตัวสุดท้ายของมัน (ถ้ามี) Finalizer นั้นสามารถทำการโทร "fallback" เพื่อทิ้งหากจำเป็นแม้ว่าฉันจะไม่แน่ใจว่า SqlConnection ทำเช่นนั้นหรือไม่
ลุค

1
มีการลดประสิทธิภาพลงหรือไม่เมื่อเราต้องตั้งค่า Max Pool ขนาด 50 และเรามีผู้ใช้เพียงไม่กี่คน
mahesh sharma

37

เมื่อติดตั้ง. NET Framework v4.6.1 การเชื่อมต่อกับฐานข้อมูลระยะไกลของเราเริ่มหมดเวลาทันทีเนื่องจากการเปลี่ยนแปลงนี้

ในการแก้ไขให้เพิ่มพารามิเตอร์TransparentNetworkIPResolutionในสตริงการเชื่อมต่อและตั้งค่าเป็นเท็จ :

เซิร์ฟเวอร์ = myServerName; ฐานข้อมูล = mydatabase; Trusted_Connection = true; TransparentNetworkIPResolution = false


ในกรณีนี้ปัญหาคือ "รอบระยะเวลาการหมดเวลาผ่านไปก่อนที่จะได้รับการเชื่อมต่อจากกลุ่ม" สตริงการเชื่อมต่อของคุณแก้ไขได้หรือไม่หรือเป็นปัญหาการจับมือกันหรือไม่
FBryant87

1
จากสิ่งที่ฉันจำได้ว่ามันเป็นข้อความแสดงข้อผิดพลาดเดียวกันกับในคำถาม มันเกิดขึ้นทันทีหลังจากอัพเดตเป็น. NET Framework v4.6.1
ajbeaven

นี่เป็นกรณีสำหรับฉันเช่นกันแก้ไขให้ฉันด้วยบริการแอพที่ฉันใช้บน Azure เชื่อมต่อกับฐานข้อมูล Azure SQL ฉันใช้ Dapper และกำจัดการเชื่อมต่ออย่างถูกต้อง แต่ยังคงได้รับข้อความข้อผิดพลาด "หมดเวลาก่อนที่จะได้รับการเชื่อมต่อจากกลุ่ม" แต่ไม่มากขอบคุณ @ajbeaven
Steve Kennaird

13

เว้นแต่ว่าการใช้งานของคุณเพิ่มขึ้นมากดูเหมือนว่าไม่น่าเป็นไปได้ว่ามีเพียงงานค้าง IMO ตัวเลือกที่เป็นไปได้มากที่สุดคือบางสิ่งกำลังใช้การเชื่อมต่อและไม่ปล่อยทันที คุณแน่ใจหรือว่าคุณกำลังใช้usingในทุกกรณี? หรือ (ผ่านกลไกอะไรก็ได้) ที่ปล่อยการเชื่อมต่อ?


13

คุณตรวจสอบ DataReaders ที่ไม่ได้ปิดและ response.redirects ก่อนที่จะปิดการเชื่อมต่อหรือ Data การเชื่อมต่อจะเปิดอยู่เมื่อคุณไม่ปิดก่อนการเปลี่ยนเส้นทาง


3
1 - หรือฟังก์ชั่น datareaders กลับ - การเชื่อมต่อจะไม่เคยปิดนอกฟังก์ชั่นที่คุณสร้างพวกเขา ...
splattne

1
ถ้าฟังก์ชั่นของคุณคืน SqlDataReader คุณจะดีกว่าที่จะแปลงเป็น DataTable มากกว่าการเพิ่มขนาดพูลสูงสุด
ไลฟ์ -

10

เราพบปัญหานี้เป็นครั้งคราวในเว็บไซต์ของเราเช่นกัน ผู้กระทำผิดในกรณีของเราคือสถิติ / ดัชนีของเราล้าสมัย ซึ่งทำให้คิวรีที่ทำงานเร็วก่อนหน้านี้กลายเป็นช้าและหมดเวลา

ลองอัปเดตสถิติและ / หรือสร้างดัชนีขึ้นใหม่ในตารางที่ได้รับผลกระทบจากแบบสอบถามและดูว่ามีประโยชน์หรือไม่


3
ฉันคิดว่าสิ่งนี้จะอธิบายได้ว่าเหตุใดแบบสอบถามจึงหมดเวลา แต่ฉันไม่คิดว่าสิ่งนี้จะอธิบายได้ว่าเหตุใดจึงมีประสบการณ์หมดเวลาขณะพยายามเชื่อมต่อ
DrGriff

1
อาจเป็นไปได้ว่าเมื่อใช้ดัชนีที่ไม่ดีแบบสอบถามจะใช้เวลานานขึ้นและมีการเชื่อมต่อมากขึ้นในเวลาเดียวกัน
LosManos

1
ทำงานให้ฉันหลังจากอัปเดตสถิติทั้งหมดด้วย sp_updatestats บน db: EXEC sp_updatestats;
boateng

6

คุณสามารถระบุขนาดพูลขั้นต่ำและสูงสุดโดยการระบุMinPoolSize=xyzและ / หรือMaxPoolSize=xyzในสตริงการเชื่อมต่อ สาเหตุของปัญหานี้อาจแตกต่างกันอย่างไรก็ตาม


3
MaxPoolSize ที่แนะนำคืออะไร
Amr Elgarhy

2
น่าจะเป็นวิธีที่ดีที่สุดที่จะไปเป็นไม่ได้ที่จะระบุว่าถ้าคุณมีความต้องการพิเศษและคุณรู้ว่าขนาดสระว่ายน้ำที่ดีสำหรับคุณกรณีเฉพาะ
Mehrdad Afshari

1
หมายเหตุ: ฉันตรวจสอบแล้วและพบว่าการเชื่อมต่อที่ใช้งานกับฐานข้อมูลของฉันอยู่ที่ประมาณ 22 รายการสดนั่นมากเกินไปหรือไม่
Amr Elgarhy

ฉันไม่คิดอย่างนั้น ขนาดพูลเริ่มต้นคือ 100 การเชื่อมต่อที่ฉันคิด ขึ้นอยู่กับโหลดของแต่ละการเชื่อมต่อบนเครือข่ายและเซิร์ฟเวอร์ SQL หากสิ่งเหล่านั้นกำลังเรียกใช้คิวรีจำนวนมากอาจเป็นสาเหตุของปัญหา นอกจากนี้ปัญหาเครือข่ายอาจเกิดขึ้นเมื่อเริ่มต้นการเชื่อมต่อใหม่และอาจทำให้เกิดข้อยกเว้นนั้น
Mehrdad Afshari

5

ฉันพบปัญหานี้เช่นกันเมื่อใช้ชั้นข้อมูลของบุคคลที่สามในแอปพลิเคชัน. NET ของฉัน ปัญหาคือเลเยอร์ไม่ได้ปิดการเชื่อมต่ออย่างถูกต้อง

เราโยนเลเยอร์ออกมาและสร้างขึ้นเองซึ่งจะปิดและเปิดการเชื่อมต่อเสมอ ตั้งแต่นั้นเราจะไม่ได้รับข้อผิดพลาดอีกต่อไป


เรากำลังใช้ LLBL และเว็บไซต์นั้นเริ่มต้นจาก 2 ปีและเมื่อไม่กี่วันที่ผ่านมาก็เริ่มทำสิ่งนี้
Amr Elgarhy

5

คุณสามารถลองเช่นกันเพื่อแก้ปัญหาการหมดเวลา:

หากคุณไม่ได้เพิ่ม httpRuntime ลงใน webconfig ของคุณให้เพิ่มเข้าไปใน<system.web>แท็ก

<sytem.web>
     <httpRuntime maxRequestLength="20000" executionTimeout="999999"/>
</system.web>

และ

แก้ไขสตริงการเชื่อมต่อของคุณเช่นนี้

 <add name="connstring" connectionString="Data Source=DSourceName;Initial Catalog=DBName;Integrated Security=True;Max Pool Size=50000;Pooling=True;" providerName="System.Data.SqlClient" />

ที่ใช้งานล่าสุด

    try
    {...} 
    catch
    {...} 
    finaly
    {
     connection.close();
    }

3

นี่เป็นสาเหตุหลักมาจากการเชื่อมต่อไม่ได้ถูกปิดในแอปพลิเคชัน ใช้ "MinPoolSize" และ "MaxPoolSize" ในสตริงการเชื่อมต่อ


3

ในกรณีของฉันฉันไม่ได้ปิดวัตถุ DataReader

        using (SqlCommand dbCmd = new SqlCommand("*StoredProcedureName*"))
        using (dbCmd.Connection = new SqlConnection(WebConfigurationAccess.ConnectionString))
            {
            dbCmd.CommandType = CommandType.StoredProcedure;

            //Add parametres
            dbCmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = ID;
.....
.....
            dbCmd.Connection.Open();
            var dr = dbCmd.ExecuteReader(); //created a Data reader here
            dr.Close();    //gotta close the data reader
            //dbCmd.Connection.Close(); //don't need this as 'using' statement should take care of this in its implicit dispose method.
            }

2

หากคุณกำลังทำงานกับรหัสดั้งเดิมที่ซับซ้อนซึ่งใช้งานง่าย (.. ) {.. } เป็นไปไม่ได้อย่างที่ฉันเคยเป็น - คุณอาจต้องการตรวจสอบข้อมูลโค้ดที่ฉันโพสต์ในคำถาม SOนี้เพื่อหาวิธีการ call stack ของการสร้างการเชื่อมต่อเมื่อมีการรั่วไหลของการเชื่อมต่อที่อาจเกิดขึ้น (ไม่ได้ปิดหลังจากการหมดเวลาที่กำหนด) ทำให้ง่ายต่อการสังเกตสาเหตุของการรั่วไหล


2

อย่ายกตัวอย่างการเชื่อมต่อ sql มากเกินไป เปิดการเชื่อมต่อหนึ่งหรือสองและใช้พวกเขาสำหรับการดำเนินงาน sql ถัดไปทั้งหมด

ดูเหมือนว่าแม้เมื่อDisposeมีการเชื่อมต่อข้อยกเว้นจะถูกโยน


2

นอกเหนือจากโซลูชั่นที่โพสต์แล้ว ....

ในการจัดการกับรหัสเก่า 1,000 หน้าแต่ละครั้งเรียกใช้ GetRS ทั่วไปหลายครั้งนี่เป็นอีกวิธีหนึ่งในการแก้ไขปัญหา:

ใน DLL ทั่วไปที่มีอยู่เราเพิ่มตัวเลือกCommandBehavior.CloseConnection :

    static public IDataReader GetRS(String Sql)
    {
        SqlConnection dbconn = new SqlConnection(DB.GetDBConn());
        dbconn.Open();
        SqlCommand cmd = new SqlCommand(Sql, dbconn);
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);   
    }

จากนั้นในแต่ละหน้าตราบใดที่คุณปิดตัวอ่านข้อมูลการเชื่อมต่อจะถูกปิดโดยอัตโนมัติเพื่อป้องกันการรั่วไหลของการเชื่อมต่อ

    IDataReader rs = CommonDLL.GetRS("select * from table");
    while (rs.Read())
    {
        // do something
    }
    rs.Close();   // this also closes the connection

2

ฉันเพิ่งมีปัญหาเดียวกันและต้องการแบ่งปันสิ่งที่ช่วยฉันค้นหาแหล่งที่มา: เพิ่มชื่อแอปพลิเคชันไปยังสตริงการเชื่อมต่อของคุณแล้วกระตุ้นการเชื่อมต่อที่เปิดไปยัง SQL Server

select st.text,
    es.*, 
    ec.*
from sys.dm_exec_sessions as es
    inner join sys.dm_exec_connections as ec on es.session_id = ec.session_id
    cross apply sys.dm_exec_sql_text(ec.most_recent_sql_handle) st
where es.program_name = '<your app name here>'

1

ปัญหานี้ฉันมีในรหัสของฉัน ฉันจะวางโค้ดตัวอย่างที่ฉันมีเหนือข้อผิดพลาด รอบระยะเวลาการหมดเวลาผ่านไปก่อนที่จะได้รับการเชื่อมต่อจากกลุ่ม สิ่งนี้อาจเกิดขึ้นเนื่องจากการเชื่อมต่อที่พูลทั้งหมดถูกใช้งานและถึงขนาดสูงสุดแล้ว

 String query = "insert into STATION2(ID,CITY,STATE,LAT_N,LONG_W) values('" + a1 + "','" + b1 + "','" + c1 + "','" + d1 + "','" + f1 + "')";
    //,'" + d1 + "','" + f1 + "','" + g1 + "'

    SqlConnection con = new SqlConnection(mycon);
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = query;
    cmd.Connection = con;
    cmd.ExecuteNonQuery();
    **con.Close();**

คุณต้องการปิดการเชื่อมต่อทุกครั้ง ก่อนหน้านั้นฉันไม่ได้พวกเราเชื่อมต่ออย่างใกล้ชิดเนื่องจากสิ่งนี้ฉันได้รับข้อผิดพลาด หลังจากเพิ่มคำสั่งปิดฉันมีข้อผิดพลาดนี้มา


0

คุณมีการเชื่อมต่อรั่วไหลออกมาในรหัสของคุณ คุณอาจลองใช้การใช้เพื่อรับรองว่าคุณกำลังปิดพวกเขา

 Using (SqlConnection sqlconnection1 = new SqlConnection(“Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5”)) {
                          sqlconnection1.Open();
                          SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
                          sqlcommand1.CommandText = raiserror (‘This is a fake exception’, 17,1)”;
                          sqlcommand1.ExecuteNonQuery();  //this throws a SqlException every time it is called.
                          sqlconnection1.Close(); //Still never gets called.
              } // Here sqlconnection1.Dispose is _guaranteed_

https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/


0

ปัญหานี้ฉันเคยพบมาก่อน ในที่สุดมันก็มีปัญหากับไฟร์วอลล์ ฉันเพิ่งเพิ่มกฎลงในไฟร์วอลล์ ฉันต้องเปิดพอร์ต1433เพื่อให้เซิร์ฟเวอร์ SQL สามารถเชื่อมต่อกับเซิร์ฟเวอร์


0

ใช้สิ่งนี้:

finally
{
    connection.Close();
    connection.Dispose();
    SqlConnection.ClearPool();
}

12
บางทีฉันอาจพลาดจุดSqlConnection.ClearPoolนี้ไป แต่นั่นเป็นเพียงการป้องกันไม่ให้การเชื่อมต่อปัจจุบันของคุณถูกปล่อยกลับไปยังกลุ่มการเชื่อมต่อหรือไม่ ฉันคิดว่าความคิดของพูลการเชื่อมต่อคืออนุญาตการเชื่อมต่อที่เร็วขึ้น ปล่อยการเชื่อมต่อจากพูลอย่างแน่นอนทุกครั้งที่เสร็จสิ้นหมายความว่าต้องสร้างการเชื่อมต่อใหม่ทุกครั้งที่ต้องการแทนที่จะดึงอะไหล่สำรองจากพูลหรือไม่ โปรดอธิบายว่าทำไมเทคนิคนี้ถึงมีประโยชน์อย่างไร
Dib

0

ใช่มีวิธีเปลี่ยนการกำหนดค่า หากคุณอยู่บนเซิร์ฟเวอร์เฉพาะและต้องการการเชื่อมต่อ SQL เพิ่มเติมคุณสามารถอัปเดตรายการ "ขนาดพูลสูงสุด" ในทั้งสองสตริงการเชื่อมต่อโดยทำตามคำแนะนำเหล่านี้:

  1. เข้าสู่เซิร์ฟเวอร์ของคุณโดยใช้ Remote Desktop
  2. เปิด My Computer (Windows - E) และไปที่ C: \ inetpub \ vhosts [domain] \ httpdocs
  3. ดับเบิลคลิกที่ไฟล์ web.config สิ่งนี้อาจถูกระบุว่าเป็นเว็บหากโครงสร้างไฟล์ถูกตั้งค่าให้ซ่อนนามสกุล สิ่งนี้จะเปิดขึ้น Visual Basic หรือโปรแกรมแก้ไขที่คล้ายกัน
  4. ค้นหา Connection Strings ของคุณเหล่านี้จะมีลักษณะคล้ายกับตัวอย่างด้านล่าง:

    "เพิ่มชื่อ =" SiteSqlServer "connectionString =" เซิร์ฟเวอร์ = (ท้องถิ่น); ฐานข้อมูล = dbname; uid = dbuser; pwd = dbpassword; pooling = true อายุการใช้งานการเชื่อมต่อ = 120; ขนาดพูลสูงสุด = 25; ""

5. เปลี่ยนขนาดพูลสูงสุด = ค่า X เป็นขนาดพูลที่ต้องการ

  1. บันทึกและปิดไฟล์ web.config ของคุณ

0

ตรวจสอบให้แน่ใจว่าคุณตั้งค่าการตั้งค่าที่ถูกต้องสำหรับพูลการเชื่อมต่อ สิ่งนี้สำคัญมากอย่างที่ฉันได้อธิบายไว้ในบทความต่อไปนี้: https://medium.com/@dewanwaqas/configurations-that-signentiallyly-improves-your-app-performance-built-using-sql-server-and-net- ed044e53b60 คุณจะเห็นการปรับปรุงอย่างมากในประสิทธิภาพของแอปพลิเคชันของคุณหากคุณทำตาม


0

ในกรณีของฉันฉันมีวงวนไม่สิ้นสุด (จากการรับ Property พยายามรับค่าจากฐานข้อมูล) ซึ่งเปิดการเชื่อมต่อ SQL หลายร้อยรายการ

หากต้องการทำให้เกิดปัญหาอีกครั้งให้ลองสิ่งนี้:

while (true)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        someCall(connection);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.