หมดเวลาการเชื่อมต่อสำหรับเซิร์ฟเวอร์ SQL


109

ฉันสามารถเพิ่มระยะหมดเวลาโดยการแก้ไขสตริงการเชื่อมต่อในweb.config?


7
อย่าอ่านสิ่งนี้เหมือนที่ฉันคิดว่าการหมดเวลาจะควบคุมการดำเนินการสืบค้น - ไม่เพียง แต่การหมดเวลาในการเชื่อมต่อกับเซิร์ฟเวอร์เท่านั้น "การหมดเวลาการเชื่อมต่อ" จะเป็นชื่อที่ดีกว่า ดูstackoverflow.com/a/7976867/409856
downwitch

คำตอบ:


213

ใช่คุณสามารถผนวก;Connection Timeout=30ที่คุณสตริงการเชื่อมต่อและระบุค่าที่คุณต้องการ

ค่าการหมดเวลาที่ตั้งอยู่ในConnection Timeoutสถานที่ให้บริการเป็นเวลาที่แสดงในไม่กี่วินาที หากไม่ได้ตั้งค่าคุณสมบัตินี้ค่าการหมดเวลาสำหรับการเชื่อมต่อจะเป็นค่าเริ่มต้น (15 วินาที)

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

ค่า 0 แสดงว่าไม่มีขีด จำกัด และควรหลีกเลี่ยงใน ConnectionString เนื่องจากการพยายามเชื่อมต่อจะรอไปเรื่อย ๆ


คุณสามารถยกตัวอย่างนี้ได้หรือไม่? ฉันใช้ EF6 และฉันมี 3 ล้านข้อมูลในตารางของฉันเมื่อฉันทำบางโปรแกรมกระบวนการส่งกลับข้อผิดพลาดการหมดเวลา ... หมายเหตุ: ฉันใช้การทำดัชนีในตาราง
saulyasar

4
@saulyasar นี่คือการหมดเวลาของ CONNECTION ไม่ใช่การหมดเวลาของคำสั่ง การหมดเวลาของการเชื่อมต่อคือระยะเวลาที่จะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ sql คุณต้องการตรวจสอบการหมดเวลาของคำสั่งซึ่งเป็นระยะเวลาที่กระบวนการหรือคำสั่งจะทำงานก่อนหมดเวลา
granadaCoder

32

อืม ...

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

เมื่อคุณหมดเวลาการเชื่อมต่อมักจะมีปัญหากับข้อใดข้อหนึ่งต่อไปนี้:

  1. การกำหนดค่าเครือข่าย - การเชื่อมต่อช้าระหว่างเว็บเซิร์ฟเวอร์ / กล่อง dev และเซิร์ฟเวอร์ SQL การเพิ่มระยะหมดเวลาอาจช่วยแก้ไขปัญหานี้ได้ แต่ควรตรวจสอบปัญหาที่เกิดขึ้น

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

  3. สตริงการเชื่อมต่อ 2: หากคุณระบุชื่อเซิร์ฟเวอร์ไม่ถูกต้องหรือไม่สมบูรณ์ (เช่นmysqlserverแทนที่จะเป็นmysqlserver.webdomain.com) คุณจะหมดเวลา คุณสามารถ ping เซิร์ฟเวอร์โดยใช้ชื่อเซิร์ฟเวอร์ตรงตามที่ระบุในสตริงการเชื่อมต่อจากบรรทัดคำสั่งได้หรือไม่

  4. สตริงการเชื่อมต่อ 3: หากชื่อเซิร์ฟเวอร์อยู่ใน DNS ของคุณ (หรือไฟล์โฮสต์) แต่ชี้ไปที่ IP ที่ไม่ถูกต้องหรือไม่สามารถเข้าถึงได้คุณจะได้รับการหมดเวลาแทนที่จะเป็นข้อผิดพลาดที่ไม่พบเครื่อง

  5. ข้อความค้นหาที่คุณกำลังโทรหากำลังหมดเวลา อาจดูเหมือนว่าการเชื่อมต่อกับเซิร์ฟเวอร์เป็นปัญหา แต่ทั้งนี้ขึ้นอยู่กับว่าแอปของคุณมีโครงสร้างอย่างไรคุณสามารถดำเนินการไปจนถึงขั้นตอนที่การสืบค้นของคุณกำลังดำเนินการก่อนที่จะหมดเวลา

  6. การเชื่อมต่อรั่ว กำลังทำงานอยู่กี่กระบวนการ เปิดการเชื่อมต่อกี่ครั้ง? ฉันไม่แน่ใจว่า ADO.NET ดิบดำเนินการพูลการเชื่อมต่อหรือไม่ปิดการเชื่อมต่อโดยอัตโนมัติเมื่อจำเป็น ala Enterprise Library หรือที่กำหนดค่าทั้งหมด นี่น่าจะเป็นปลาชนิดหนึ่งสีแดง แม้ว่าเมื่อทำงานกับ WCF และบริการบนเว็บฉันมีปัญหากับการเชื่อมต่อที่ไม่ปิดซึ่งทำให้หมดเวลาและพฤติกรรมอื่น ๆ ที่คาดเดาไม่ได้

สิ่งที่ต้องลอง:

  1. คุณหมดเวลาเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ด้วย SQL Management Studio หรือไม่? หากเป็นเช่นนั้นการกำหนดค่าเครือข่ายน่าจะเป็นปัญหา หากคุณไม่พบปัญหาเมื่อเชื่อมต่อกับ Management Studio ปัญหาจะอยู่ในแอปของคุณไม่ใช่ที่เซิร์ฟเวอร์

  2. เรียกใช้ SQL Profiler และดูว่ามีอะไรเกิดขึ้นจริง คุณควรจะสามารถบอกได้ว่าคุณกำลังเชื่อมต่ออยู่จริงๆหรือคำถามคือปัญหา

  3. เรียกใช้แบบสอบถามของคุณใน Management Studio และดูว่าใช้เวลานานแค่ไหน

โชคดี!


หากคำถามของคุณหมดเวลาฉันเดาว่าคุณจะได้รับคำสั่งหมดเวลา
user55474

@ user55474 คง; ขึ้นอยู่กับ ( มากไม่ค่อย) เกี่ยวกับวิธีการที่มันถูกเรียกว่า
3Dave

ไม่เป็นไปตามโพสต์ในบล็อกmsdn นี้
tom redfern

@hugh ฉันเชื่อว่าฉันบอกว่ามันหายาก แต่ฉันเคยเห็นมันครั้งแรก
3Dave

1
+1 สำหรับ "Run SQL Profiler" ดูเหมือนจะซับซ้อน แต่จริงๆแล้วคุณเพียงแค่คลิก "Tools> SQL Server Profiler" และดูว่าแอปของคุณพูดกับ SQL Server ว่าอย่างไร ปรากฎว่าของฉันคือตัวเลือก # 5 :)
Andrew Kvochick

11

หากคุณต้องการที่จะเปลี่ยนมันแบบไดนามิกที่ผมชอบใช้ SqlConnectionStringBuilder

ช่วยให้คุณสามารถแปลง ConnectionString เช่นสตริงเป็นคลาส Object คุณสมบัติสตริงการเชื่อมต่อทั้งหมดจะกลายเป็นสมาชิก

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

เช่นเดียวกับที่สร้าง Object ขึ้นมาและเป็นการดีที่จะกำหนดค่าในวัตถุแทนการจัดการสตริง

นี่คือตัวอย่างโค้ด:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);

2
ฉันไม่อยากจะเชื่อเลยว่าการสร้างConnectionTimeoutคุณสมบัติเป็นSqlConnectionประเภทอ่านอย่างเดียวนั้นเป็นความคิดที่ดี
Maslow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.