Apa perbedaan antara SqlCommand.CommandTimeout dan SqlConnection.ConnectionTimeout?

88

Apakah ada perbedaan antara SqlCommand.CommandTimeoutdan SqlConnection.ConnectionTimeoutdi .NET?

Dhanapal
sumber
apakah ini khusus untuk MS SQL Server?
ympostor

Jawaban:

129

Iya. CommandTimeoutadalah berapa lama waktu yang dibutuhkan untuk menyelesaikan satu perintah. ConnectionTimeoutadalah berapa lama waktu yang dibutuhkan untuk membuat sambungan ke server untuk memulai.

Misalnya, Anda mungkin menjalankan kueri yang berjalan relatif lama - tidak masalah bagi mereka untuk menyelesaikannya selama 10 menit, tetapi jika perlu 10 menit untuk membuat koneksi untuk memulai, Anda akan tahu bahwa ada sesuatu yang salah.

Jon Skeet
sumber
5
Demi argumen, katakanlah saya punya! ** & # Q @? kueri yang membutuhkan waktu 32 detik untuk dijalankan. Jika saya menyetel SqlCommand.CommandTimeout = 40 tetapi membiarkan SqlConnection.ConnectionTimeout pada defaultnya (mungkin 30), akankah waktu koneksi habis? Dengan kata lain, apakah saya harus menyetel kedua properti? Kedengarannya seperti Anda mengatakan "tidak", tetapi saya pasti lupa tentang properti SqlConnection.ConnectionTimeout dan mulai mempertanyakan apakah pengaturan CommandTimeout melakukan semua yang saya perlukan.
flipdoubt
29
flipdoubt - CommandTimeout akan memengaruhi kueri, ConnectionTimout tidak akan. ConnectionTimout bukanlah waktu tunggu untuk koneksi ke kueri peform - itu hanya waktu tunggu untuk koneksi untuk menyambungkan ke database di tempat pertama.
Robin Bennett
1
@ JonSkeet melakukan CommandTimeout dan ConnectionTimeout, keduanya menghasilkan pengecualian umum yang sama? Atau pengecualian yang berbeda?
Yasser Shaikh
1
@Yasser: Saya tidak tahu, saya takut.
Jon Skeet
6
Ingatlah bahwa CommandTimeout tampaknya berlaku hanya sampai titik di mana baris pertama dikembalikan dari SQL Server ke kode klien. Misalnya, jika Anda memiliki kueri yang mengembalikan baris pertama dalam waktu 30 detik, tetapi kumpulan baris lengkap membutuhkan waktu berjam-jam untuk dikembalikan, menyetel batas waktu ke 30 detik tidak akan membuat kueri tersebut habis waktunya dan kueri akan berjalan selama berjam-jam. Ini terutama terjadi jika Anda tidak memiliki operator pemblokiran (seperti Order by) di sebelah kiri rencana eksekusi Anda. (Posting karena saya menghabiskan 2 hari men-debug ini dan tidak ada referensi lain tentang masalah ini)
Dave
28

SqlCommand.CommandTimeout= batas waktu tunggu untuk kueri SQL Anda. Berarti, berapa banyak waktu (misalnya: SELECT, UPDATE) permintaan dapat mengambil untuk pelaksanaannya. Jika melebihi SqlCommand.CommandTimeout, maka eksekusi akan dihentikan. Kesalahan waktu tunggu perintah akan terjadi.

SqlConnection.ConnectionTimeout= batas waktu habis untuk koneksi Anda. Berarti, berapa lama objek koneksi Anda dapat mencoba untuk terhubung. Jika melebihi waktu yang ditentukan, itu berhenti terhubung. Kesalahan batas waktu koneksi akan terjadi.

NinethSense
sumber
11

ConnectionTimeoutMenentukan durasi menunggu sebelum waktu keluar ketika mencoba untuk membuka sebuah SqlConnection. Ini relevan dengan Connection.Open()perintah.

sementara

SqlCommand.CommandTimeoutmenentukan durasi untuk SqlCommand menunggu sebelum waktu habis. Ini terjadi setelah koneksi dibuka dan salah satu ExecuteXXXmetode telah dipanggil pada objek Command.

Cerebrus
sumber
8

Informasi tambahan

Nilai defaultnya CommandTimeoutadalah 30 detik. Nol (0) menunjukkan tidak ada batasan. Anda hanya dapat menyetel CommandTimeoutnilai dalam Coding.

Nilai defaultnya ConnectiontTimeoutadalah 15 detik. Nol (0) menunjukkan tidak ada batasan juga. Nilai kurang dari nol (nilai minus) akan didapat ArgumentException. Anda dapat menyetel ConnectionTimeoutnilai di file Coding dan Config.

Htin Aung
sumber
0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
dodng
sumber
2
Ini adalah tipe waktu tunggu ke-3. Tidak satu pun dari dua hal yang ditanyakan pemilik topik. Dan tidak menjawab pertanyaan itu. Saya tidak akan -1 itu, karena saya tidak tahu apa pertanyaannya sebelum mengedit.
Csaba Toth
0

Catatan singkat mengenai CommandTimeout, karena ini adalah properti dari objek Connection dan Command ...

Pengaturan CommandTimeout pada objek Connection tidak berpengaruh pada pengaturan CommandTimeout pada objek Command pada Connection yang sama; Artinya, properti CommandTimeout objek Command tidak mewarisi nilai dari nilai CommandTimeout objek Connection.

Jadi pengaturan CommandTimeout pada objek Connection hanya mempengaruhi perintah yang dijalankan di bawah objek Connection saja (tanpa menggunakan objek Command).

misalnya Saat Anda menghubungkan ke Proc Tersimpan dan menambahkan parameter ke objek perintah, dan menjalankan objek Perintah menggunakan koneksi Objek Koneksi, maka Anda perlu menyetel CommandTimeout pada objek Command dan ConnectionTimeout pada objek Koneksi untuk menimpa keduanya default. Menyetel CommandTimeout pada Objek Koneksi tidak akan menimpa batas waktu default untuk perintah Objek Perintah.

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

Brad Skidmore
sumber