SqlCommand.CommandTimeout ve SqlConnection.ConnectionTimeout arasındaki fark nedir?


Yanıtlar:


129

Evet. CommandTimeouttek bir komutun tamamlanmasının ne kadar süreceğidir. ConnectionTimeoutbaşlamak için sunucuyla bağlantı kurmanın ne kadar süreceğidir.

Örneğin, nispeten uzun süren sorgular yürütüyor olabilirsiniz - tamamlamaları 10 dakika sürmesi tamamen normaldir, ancak bağlantının başlaması 10 dakika sürdüyse, bir şeylerin çok yanlış olduğunu anlarsınız.


5
Tartışma uğruna, diyelim ki bir! ** & # Q @? 32 saniye süren sorgu. SqlCommand.CommandTimeout = 40 olarak ayarlayıp SqlConnection.ConnectionTimeout'u varsayılan değerinde (muhtemelen 30) bırakırsam, bağlantı zaman aşımına uğrar mı? Diğer bir deyişle, her iki özelliği de ayarlamam gerekir mi? "Hayır" diyorsunuz gibi geliyor, ancak SqlConnection.ConnectionTimeout özelliğini unutmuş olmalı ve CommandTimeout'u ayarlamanın ihtiyacım olan her şeyi yapıp yapmadığını sorgulamaya başladım.
flipdoubt

29
flipdoubt - CommandTimeout sorguyu etkileyecek, ConnectionTimout olmayacak. ConnectionTimout, peform sorgulara bağlantı için bir zaman aşımı değildir - sadece bağlantının ilk etapta veritabanına bağlanması için zaman aşımıdır.
Robin Bennett

1
@JonSkeet CommandTimeout ve ConnectionTimeout yapıyor, her ikisi de aynı genel özel durumu oluşturuyor mu? Veya farklı istisnalar?
Yasser Shaikh

1
@Yasser: Bilmiyorum, korkuyorum.
Jon Skeet

6
CommandTimeout'un yalnızca ilk satırın SQL Server'dan istemci koduna döndürüldüğü noktaya kadar geçerli göründüğünü unutmayın. Örneğin, 30 saniye içinde ilk satırı döndüren bir sorgunuz varsa, ancak satır kümesinin tamamının dönmesi saatler sürüyorsa, zaman aşımını 30 saniyeye ayarlamak sorgu için zaman aşımına uğramaz ve sorgu saatler boyunca çalışır. Bu, esas olarak yürütme planınızın LHS'sinde engelleme operatörleri (Sipariş veren gibi) yoksa geçerlidir. (Bu konuda hata ayıklamak için 2 gün harcadığım ve konuyla ilgili başka referans olmadığı için yayınlanıyor)
Dave

28

SqlCommand.CommandTimeout= SQL sorgunuz için zaman aşımı sınırı. Means, bir süreyi (örn: SELECT, UPDATE) sorgu yürütme için alabilir. Aşarsa SqlCommand.CommandTimeout, yürütmeyi durdurur. Bir komut zaman aşımı hatası oluşacaktır.

SqlConnection.ConnectionTimeout= bağlantınız için zaman aşımı sınırı. Bağlantı nesnenizin ne kadar zaman bağlanmaya çalışabileceği anlamına gelir. Belirtilen süreyi aşarsa, bağlanmayı durdurur. Bir bağlantı zaman aşımı hatası oluşacaktır.


11

ConnectionTimeoutbelirtir süresi çalışırken dışarı zamanlama önce beklenecek açmak bir SqlConnection. Komutla ilgilidir Connection.Open().

süre

SqlCommand.CommandTimeoutbir SqlCommand'in zaman aşımına uğramadan önce bekleyeceği süreyi belirtti. Bu, bir bağlantı açıldıktan ve ExecuteXXXyöntemlerden biri Command nesnesinde çağrıldıktan sonra gerçekleşir.


8

İlave bilgi

Varsayılan değer CommandTimeout30 saniyedir. Sıfır (0) sınır olmadığını gösterir. Yalnızca CommandTimeoutKodlamada değer ayarlayabilirsiniz .

Varsayılan değer ConnectiontTimeout15 saniyedir. Sıfır (0) da sınır olmadığını gösterir. Sıfırdan küçük değer (eksi değer) alacaktır ArgumentException. ConnectionTimeoutHem Kodlama hem de Yapılandırma dosyasında değer ayarlayabilirsiniz .


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

2
Bu 3. tür bir zaman aşımıdır. Konu sahibinin sorduğu iki kişiden biri değil. Ve soruya cevap vermiyor. Bunu -1 yapmayacağım, çünkü düzenlemelerden önce sorunun ne olduğunu bilmiyorum.
Csaba Toth

0

Hem Connection hem de Command nesnelerinin bir özelliği olduğu için CommandTimeout ile ilgili hızlı not ...

Bir Connection nesnesindeki CommandTimeout ayarının, aynı Bağlantı üzerindeki bir Command nesnesi üzerindeki CommandTimeout ayarı üzerinde hiçbir etkisi yoktur; diğer bir deyişle, Command nesnesinin CommandTimeout özelliği, Connection nesnesinin CommandTimeout değerinin değerini devralmaz.

Dolayısıyla, bir Connection nesnesindeki CommandTimeout ayarı, yalnızca Connection nesnesi altında yürütülen komutları etkiler (bir Command nesnesi kullanmadan).

Örneğin, Depolanan bir Proc'a bağlanırken ve komut nesnesine parametreler eklerken ve bir Bağlantı Nesnesinin bağlantısını kullanarak Command nesnesini çalıştırırken, her ikisini de geçersiz kılmak için Command nesnesinde CommandTimeout ve Connection nesnesinde ConnectionTimeout ayarlamanız gerekir. varsayılanlar. Bağlantı Nesnesi üzerinde CommandTimeout'u ayarlamak, Komut Nesnesi komutları için varsayılan zaman aşımını geçersiz kılmaz.

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 / reference / ado-api / connectiontimeout-property-ado? view = sql-server-ver15

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.