SqlCommand.CommandTimeout และ SqlConnection.ConnectionTimeout แตกต่างกันอย่างไร


คำตอบ:


129

ใช่. CommandTimeoutคำสั่งเดียวใช้เวลานานเพียงใดจึงจะเสร็จสมบูรณ์ ConnectionTimeoutระยะเวลาในการสร้างการเชื่อมต่อกับเซิร์ฟเวอร์จึงจะเริ่มต้นได้

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


5
เพื่อประโยชน์ในการโต้แย้งสมมติว่าฉันมี! ** & # Q @? แบบสอบถามที่ใช้เวลา 32 วินาทีในการเรียกใช้ ถ้าฉันตั้งค่า SqlCommand.CommandTimeout = 40 แต่ปล่อยให้ SqlConnection.ConnectionTimeout เป็นค่าเริ่มต้น (น่าจะเป็น 30) การเชื่อมต่อจะหมดเวลาหรือไม่ กล่าวอีกนัยหนึ่งฉันต้องตั้งค่าคุณสมบัติทั้งสองหรือไม่? ดูเหมือนคุณจะพูดว่า "ไม่" แต่ฉันคงลืมเกี่ยวกับคุณสมบัติ SqlConnection.ConnectionTimeout และเริ่มตั้งคำถามว่าการตั้งค่า CommandTimeout ทำทุกอย่างที่ฉันต้องการหรือไม่
flipdoubt

29
flipdoubt - CommandTimeout จะส่งผลต่อแบบสอบถามไม่ ConnectionTimout ConnectionTimout ไม่ใช่การหมดเวลาสำหรับการเชื่อมต่อกับการสืบค้นแบบเพฟอร์ม - เป็นเพียงการหมดเวลาสำหรับการเชื่อมต่อเพื่อเชื่อมต่อกับฐานข้อมูลในตอนแรก
Robin Bennett

1
@JonSkeet ทำ CommandTimeout และ ConnectionTimeout ทั้งคู่สร้างข้อยกเว้นทั่วไปเหมือนกันหรือไม่ หรือข้อยกเว้นต่างกัน?
Yasser Shaikh

1
@ ยัสเซอร์: ฉันไม่รู้ฉันกลัว
Jon Skeet

6
โปรดทราบว่า CommandTimeout ดูเหมือนจะใช้กับจนถึงจุดที่ส่งคืนแถวแรกจาก SQL Server ไปยังรหัสไคลเอ็นต์เท่านั้น เช่นหากคุณมีคิวรีที่ส่งคืนแถวแรกภายใน 30 วินาที แต่ rowset ที่สมบูรณ์จะใช้เวลาหลายชั่วโมงในการคืนค่าการตั้งค่าการหมดเวลาเป็น 30 วินาทีจะไม่ทำให้คิวรีหมดเวลาและคิวรีจะทำงานเป็นชั่วโมง ส่วนใหญ่เป็นกรณีนี้หากคุณไม่มีตัวดำเนินการบล็อก (เช่น Order by) ใน LHS ของแผนการดำเนินการของคุณ (โพสต์เพราะฉันใช้เวลา 2 วันในการแก้ไขข้อบกพร่องนี้และไม่มีการอ้างอิงอื่น ๆ เกี่ยวกับเรื่องนี้)
Dave

28

SqlCommand.CommandTimeout= ขีด จำกัด การหมดเวลาสำหรับแบบสอบถาม SQL ของคุณ หมายถึงแบบสอบถาม(เช่น: SELECT, UPDATE) สามารถใช้เวลาในการดำเนินการได้นานเท่าใด ถ้าเกินSqlCommand.CommandTimeoutก็จะหยุดการดำเนินการ จะเกิดข้อผิดพลาดการหมดเวลาของคำสั่ง

SqlConnection.ConnectionTimeout= ขีด จำกัด การหมดเวลาสำหรับการเชื่อมต่อของคุณ หมายถึงระยะเวลาที่วัตถุเชื่อมต่อของคุณสามารถพยายามเชื่อมต่อได้ หากเกินเวลาที่กำหนดจะหยุดเชื่อมต่อ ข้อผิดพลาดการหมดเวลาการเชื่อมต่อจะเกิดขึ้น


11

ConnectionTimeoutระบุระยะเวลาที่จะรอก่อนที่จะหมดเวลาเมื่อพยายามที่จะเปิด SqlConnectionมันเกี่ยวข้องกับConnection.Open()คำสั่ง

ในขณะที่

SqlCommand.CommandTimeoutระบุระยะเวลาสำหรับ SqlCommand เพื่อรอก่อนหมดเวลา สิ่งนี้เกิดขึ้นหลังจากเปิดการเชื่อมต่อและExecuteXXXมีการเรียกใช้วิธีใดวิธีหนึ่งบนวัตถุคำสั่ง


8

ข้อมูลเพิ่มเติม

ค่าเริ่มต้นCommandTimeoutคือ 30 วินาที ศูนย์ (0) หมายถึงไม่มีขีด จำกัด คุณสามารถตั้งCommandTimeoutค่าในการเข้ารหัสเท่านั้น

ค่าเริ่มต้นConnectiontTimeoutคือ 15 วินาที ศูนย์ (0) หมายถึงไม่มีขีด จำกัด เช่นกัน น้อยกว่าศูนย์ค่า (ค่าลบ) ArgumentExceptionจะได้รับ คุณสามารถตั้งConnectionTimeoutค่าได้ทั้งในไฟล์ Coding และ Config


0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms

2
นี่เป็นการหมดเวลาประเภทที่ 3 ไม่ใช่หนึ่งในสองข้อที่เจ้าของกระทู้ถามถึง และไม่ตอบคำถาม. ฉันจะไม่ -1 เพราะฉันไม่รู้ว่าอะไรคือคำถามก่อนแก้ไข
Csaba Toth

0

หมายเหตุด่วนเกี่ยวกับ CommandTimeout เนื่องจากเป็นคุณสมบัติของอ็อบเจ็กต์ Connection และ Command ...

การตั้งค่า CommandTimeout บนวัตถุ Connection ไม่มีผลต่อการตั้งค่า CommandTimeout บนวัตถุ Command บนการเชื่อมต่อเดียวกัน นั่นคือคุณสมบัติ CommandTimeout ของอ็อบเจ็กต์ Command ไม่สืบทอดค่าของค่า CommandTimeout ของอ็อบเจ็กต์ Connection

ดังนั้นการตั้งค่า CommandTimeout บนวัตถุ Connection จะมีผลเฉพาะคำสั่งที่ดำเนินการภายใต้วัตถุ Connection เท่านั้น (โดยไม่ใช้วัตถุ Command)

เช่นเมื่อคุณเชื่อมต่อกับ Stored Proc และเพิ่มพารามิเตอร์ให้กับวัตถุคำสั่งและเรียกใช้วัตถุ Command โดยใช้การเชื่อมต่อของ Connection Object คุณจะต้องตั้งค่า CommandTimeout บนวัตถุ Command และ ConnectionTimeout บนวัตถุ Connection เพื่อแทนที่ทั้งสองอย่าง ค่าเริ่มต้น การตั้งค่า CommandTimeout บน Connection Object จะไม่แทนที่การหมดเวลาเริ่มต้นสำหรับคำสั่ง Command Object

https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 https://docs.microsoft.com/en-us / sql / ADO / อ้างอิง / Ado-api / connectiontimeout-property-Ado? view = sql-server-ver15

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