Max Connection Pool ปกคลุมที่ 100


27

ฉันใช้ SQL Server 2008 R2 SP1 บนกล่อง Windows Server 2008 ฉันมี. สคริปต์ NET ที่ทำงานจาก Visual Studio 2010 ที่ทำสิ่งต่อไปนี้:

  • เข้าถึงฐานข้อมูล
  • ทำการเปลี่ยนแปลง
  • iterates

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

นี่คือสิ่งที่ฉันตรวจสอบแล้ว:

  • สตริงการเชื่อมต่อ SQL ใน Visual Studio 2010 (ตั้งค่าเป็น 1,000)
  • คุณสมบัติการเชื่อมต่ออินสแตนซ์ฐานข้อมูล SSMS (ตั้งค่าเป็น 0 [อินฟินิตี้] การเชื่อมต่อผู้ใช้)
  • Googled ข้อมูลบางอย่างใน Server 2008 ดูเหมือนว่าสามารถรองรับการเชื่อมต่อมากกว่า 100 รายการ
  • ก้าวผ่านโค้ดของฉันไปพร้อม ๆ กันSP_WHO2ซึ่งให้ข้อมูลเพิ่มเติมเกี่ยวกับการเชื่อมต่อแบบลอจิคัลเมื่อเห็นว่า # ของการเชื่อมต่อเริ่มต้นที่ 52 และข้อผิดพลาดของสคริปต์ที่มีข้อผิดพลาด
  • เปลี่ยนสตริงการเชื่อมต่อที่จะใช้ Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

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


1
คุณสามารถโพสต์สตริงการเชื่อมต่อของคุณ? โปรดดูคำตอบของฉัน นั่นควรจะเป็นวิธีการรักษาของคุณ (ค่านี้จะถูกระบุในสตริงการเชื่อมต่อ System.Data.SqlClientเริ่มต้นที่ 100 ซึ่งเป็นสาเหตุที่คุณจะเห็นว่าหมดการเชื่อมต่อพูล)
Thomas Stringer

คำตอบ:


24

SQL Server อนุญาตการเชื่อมต่อได้สูงสุด32767 รายการโดยค่าเริ่มต้น sp_configureมันสามารถเปลี่ยนแปลงได้โดยใช้ หากต้องการดูการกำหนดค่าปัจจุบันของคุณสำหรับการตั้งค่านี้ให้ใช้แบบสอบถามต่อไปนี้:

select * from sys.configurations
where name ='user connections'

โดยค่าเริ่มต้นคุณควรเห็นสูงสุด 32767 value_in_useเท่ากับ 0 (ใช้การตั้งค่าเริ่มต้น) หากสิ่งนี้มีการเปลี่ยนแปลงคุณสามารถกำหนดค่า SQL Server ใหม่เพื่อใช้ค่าอื่นตามที่อธิบายไว้ในลิงค์

คุณควรตรวจสอบจำนวนการเชื่อมต่อที่เกิดขึ้นจริงเนื่องจากอาจมีกิจกรรมเพิ่มเติมนอกแอปพลิเคชันของคุณ (หรือแอปพลิเคชันของคุณกำลังทำการเชื่อมต่อมากกว่าที่คุณคิด) คุณจะต้องการดูสถิติทั่วไป -> การเชื่อมต่อแบบลอจิคัลในperfmonหรือสอบถามค่าในsys.dm_os_performance_counters(cntr_value จะแสดงจุดปัจจุบันตามเวลา):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

ใช่ฉันได้ตรวจสอบการเชื่อมต่อผู้ใช้แล้ว (เป็นสิ่งแรกที่ฉันไปและเป็นวิธีที่ง่ายที่สุดในการค้นหาทั้งใน UI และในเอกสารของ Microsoft ฉันยังก้าวผ่านรหัสของฉันและคอยดูจำนวนการเชื่อมต่อทางตรรกะผ่าน SSMS โดย . ใช้ sp_who2 ซึ่งจะช่วยให้ปริมาณที่เหมาะสมของข้อมูลเกี่ยวกับการเชื่อมต่อตรรกะ Idling เซิร์ฟเวอร์ของฉันมี 51 การเชื่อมต่อเมื่อสคริปต์ไม่ก็มีการสร้าง 100 การเชื่อมต่อมากขึ้นนั่นเป็นวิธีที่ผมเคยไปที่ที่ตอนนี้ฉัน...
ฌอนยาว

ฉันชี้แจงคำถามของฉันอีกเล็กน้อยด้วยขั้นตอนที่ฉันได้ทำไป อาจไม่ใช่การตั้งค่าใน SQL เลยซึ่งเป็นสาเหตุที่ฉันเริ่มดูการตั้งค่า Windows และ Visual Studio
Sean Long

1
หากคุณตรวจสอบทั้งหมดแล้วและยังไม่สามารถเชื่อมต่อได้ 100 คำตอบจะอยู่นอกการตั้งค่าฐานข้อมูล FYI, การเชื่อมต่อ 51 รายการนั้นเป็นกระบวนการทั้งหมดของระบบ (+1 สำหรับตัวคุณเอง)
Mike Fal

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

25

max pool size=<your desired max pool size>ในสตริงการเชื่อมต่อของคุณระบุ ดังนั้นในคำอื่น ๆ หากคุณต้องการเปลี่ยนขนาดพูลสูงสุดเป็นค่า 500 สตริงการเชื่อมต่อของคุณอาจมีลักษณะเช่นนี้:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

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

นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณปิดหรือกำจัดการเชื่อมต่อของคุณอย่างถูกต้องมิฉะนั้นคุณจะผูกการเชื่อมต่อ บางสิ่งเช่นนี้ (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

การusingบล็อก (ใน C #) เรียกIDisposable.Dispose()เมื่อเสร็จสิ้น คุณสามารถนำไปใช้SqlConnection.Dispose()หรือSqlConnection.Close()ในfinallyบล็อกของtry/catch/finallyบล็อก

การอ้างอิง: เอกสาร MSDN บนคุณสมบัติ SqlConnection.ConnectionString


นี่คือสตริงการเชื่อมต่ออัปเดตคำถามของฉันด้วย Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long

3
นั่นคือสตริงการเชื่อมต่อของคุณทุกที่หรือไม่? เหตุผลที่ฉันถามเพราะสตริงการเชื่อมต่อที่แตกต่างกันจะเป็นกลุ่มการเชื่อมต่อที่แตกต่างกัน
Thomas Stringer

นั่นเป็นคำถามที่ดีมาก ฉันตรวจสอบ 3 สตริงการเชื่อมต่อจนถึงตอนนี้ แต่พวกเขาทั้งหมดกำลังหาพูลสูงสุด ฉันจะดูว่าฉันสามารถหาสตริงอื่น ๆ ที่อาจทำให้เกิด
Sean Long

หากคุณเพิ่งดีบักการดำเนินการคุณควรจะสามารถดูได้ว่าค่ารันไทม์ของSqlConnection.ConnectionStringสำหรับการดำเนินการเฉพาะนั้นคืออะไร นั่นเป็นวิธีที่ง่ายที่สุด หากmax pool sizeไม่ได้อยู่ที่นั่นก็คือ 100 แล้ว
Thomas Stringer

1
สิ่งนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบที่ได้รับการยอมรับเพราะมันจะตอบ OP อย่างถูกต้อง เขากล่าวถึงทั้งพารามิเตอร์เชื่อมต่อไคลเอนต์ของสตริงสตริงขนาดสูงสุดและจำเป็นต้องปิด / กำจัดการเชื่อมต่อ
Adam Caviness
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.