Batas waktu koneksi untuk server SQL

109

Dapatkah saya menambah waktu tunggu dengan mengubah string koneksi di web.config?

zachary
sumber
7
Jangan membaca ini seperti yang saya pikirkan bahwa batas waktu akan mengontrol eksekusi kueri - tidak, hanya batas waktu untuk menyambung ke server - "batas waktu penyambungan" akan menjadi nama yang lebih baik. Lihat stackoverflow.com/a/7976867/409856
downwitch

Jawaban:

213

Ya, Anda dapat menambahkan string koneksi;Connection Timeout=30 Anda dan menentukan nilai yang Anda inginkan.

Nilai waktu tunggu yang ditetapkan di Connection Timeoutproperti adalah waktu yang dinyatakan dalam detik . Jika properti ini tidak disetel, nilai waktu tunggu untuk koneksi adalah nilai default (15 detik).

Selain itu, menyetel nilai waktu tunggu ke 0, Anda menetapkan bahwa upaya Anda untuk menyambung menunggu waktu yang tak terbatas. Seperti yang dijelaskan dalam dokumentasi, ini adalah sesuatu yang tidak boleh Anda setel di string koneksi Anda:

Nilai 0 menunjukkan tidak ada batasan, dan harus dihindari dalam ConnectionString karena upaya untuk menghubungkan menunggu tanpa batas.

Darin Dimitrov
sumber
Bisakah Anda memberi contoh untuk ini? Saya menggunakan EF6 dan saya memiliki 3 juta data di tabel saya ketika saya melakukan beberapa program proses mengembalikan kesalahan waktu tunggu ... catatan: Saya menggunakan pengindeksan dalam tabel
saulyasar
4
@saulyasar Ini adalah batas waktu CONNECTION, bukan batas waktu COMMAND. CONNECTION timeout adalah tentang berapa lama akan mencoba CONNECT ke sql server. Anda ingin menyelidiki batas waktu COMMAND, yang merupakan berapa lama prosedur atau pernyataan akan berjalan sebelum waktu habis.
granadaCoder
32

Hmmm...

Seperti yang dikatakan Darin, Anda dapat menentukan nilai batas waktu koneksi yang lebih tinggi, tetapi saya ragu itulah masalahnya.

Ketika Anda mendapatkan waktu tunggu koneksi habis, biasanya itu masalah dengan salah satu dari berikut ini:

  1. Konfigurasi jaringan - koneksi lambat antara server web / kotak dev Anda dan server SQL. Meningkatkan batas waktu dapat memperbaiki hal ini, tetapi akan bijaksana untuk menyelidiki masalah yang mendasarinya.

  2. String koneksi. Saya telah melihat masalah di mana nama pengguna / kata sandi yang salah, karena alasan tertentu, akan memberikan kesalahan waktu tunggu alih-alih kesalahan nyata yang menunjukkan "akses ditolak." Ini seharusnya tidak terjadi, tetapi begitulah hidup.

  3. String Koneksi 2: Jika Anda salah menentukan nama server, atau tidak lengkap (misalnya, mysqlserverbukan mysqlserver.webdomain.com), Anda akan mendapatkan waktu tunggu. Dapatkah Anda melakukan ping ke server menggunakan nama server persis seperti yang ditentukan dalam string koneksi dari baris perintah?

  4. String koneksi 3: Jika nama server ada di DNS Anda (atau file host), tetapi mengarah ke IP yang salah atau tidak dapat diakses, Anda akan mendapatkan waktu tunggu daripada kesalahan mesin-tidak-ditemukan-ish.

  5. Kueri yang Anda panggil sudah habis waktunya. Sepertinya koneksi ke server adalah masalahnya, tetapi, bergantung pada bagaimana aplikasi Anda terstruktur, Anda bisa membuatnya sampai ke tahap di mana kueri Anda dieksekusi sebelum waktu tunggu terjadi.

  6. Kebocoran koneksi. Berapa banyak proses yang sedang berjalan? Berapa banyak koneksi terbuka? Saya tidak yakin apakah ADO.NET mentah melakukan penggabungan koneksi, secara otomatis menutup koneksi bila diperlukan ala Enterprise Library, atau di mana semua itu dikonfigurasi. Ini mungkin ikan haring merah. Namun, saat bekerja dengan WCF dan layanan web, saya mengalami masalah dengan koneksi yang tidak ditutup yang menyebabkan waktu tunggu dan perilaku tak terduga lainnya.

Hal untuk dicoba:

  1. Apakah Anda mendapatkan waktu tunggu saat menyambung ke server dengan SQL Management Studio? Jika demikian, kemungkinan besar konfigurasi jaringan masalahnya. Jika Anda tidak melihat masalah saat menghubungkan dengan Management Studio, masalahnya ada di aplikasi Anda, bukan di server.

  2. Jalankan SQL Profiler, dan lihat apa yang sebenarnya terjadi di kabel. Anda harus dapat mengetahui apakah Anda benar-benar terhubung, atau jika kueri adalah masalahnya.

  3. Jalankan kueri Anda di Management Studio, dan lihat berapa lama waktu yang dibutuhkan.

Semoga berhasil!

Simpan
sumber
jika kueri Anda waktunya habis maka saya rasa Anda akan mendapatkan waktu tunggu perintah
user55474
@ user55474 mungkin; tergantung ( sangat jarang) bagaimana itu dipanggil.
Menyelamatkan
Tidak menurut posting blog MSDN ini: blogs.msdn.com/b/spike/archive/2008/07/31/...
tom Redfern
@hugh saya percaya saya mengatakan itu langka, tetapi saya telah melihatnya secara langsung.
Simpan
1
1 untuk "Jalankan SQL Profiler". Kedengarannya akan rumit tetapi Anda sebenarnya cukup mengeklik "Alat> SQL Server Profiler" dan perhatikan apa yang dikatakan aplikasi Anda ke SQL Server. Ternyata milikku adalah Opsi # 5 :)
Andrew Kvochick
11

Jika Anda ingin mengubahnya secara dinamis, saya lebih suka menggunakan SqlConnectionStringBuilder .

Ini memungkinkan Anda untuk mengubah ConnectionString yaitu string menjadi Objek kelas, Semua properti koneksi string akan menjadi Anggotanya.

Dalam hal ini keuntungan sebenarnya adalah Anda tidak perlu khawatir jika bagian string ConnectionTimeout sudah ada dalam string koneksi atau tidak?

Juga karena itu membuat Objek dan selalu baik untuk menetapkan nilai dalam objek daripada memanipulasi string.

Ini contoh kodenya:

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

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);
Imran Rizvi
sumber
2
Saya tidak percaya bahwa membuat ConnectionTimeoutproperti dengan SqlConnectiontipe hanya-baca dianggap ide yang bagus.
Maslow