Saya memiliki banyak pengguna di situs web saya (20000-60000 per hari), yang merupakan situs pengunduhan untuk file seluler. Saya memiliki akses jarak jauh ke server saya (windows server 2008-R2).
Saya telah menerima kesalahan "Server tidak tersedia" sebelumnya, tetapi sekarang saya melihat kesalahan batas waktu koneksi.
Saya tidak terbiasa dengan ini - mengapa itu terjadi dan bagaimana saya bisa memperbaikinya?
Kesalahan lengkapnya adalah di bawah ini:
Kesalahan Server dalam Aplikasi '/'. Batas waktu kedaluwarsa. Periode waktu habis berlalu sebelum penyelesaian operasi atau server tidak merespons. Pernyataan itu telah dihentikan. Deskripsi: Pengecualian yang tidak ditangani terjadi selama eksekusi permintaan web saat ini. Harap tinjau jejak tumpukan untuk informasi lebih lanjut tentang kesalahan dan dari mana asalnya dalam kode.
Detail Pengecualian: System.Data.SqlClient.SqlException: Timeout kedaluwarsa. Periode waktu habis berlalu sebelum penyelesaian operasi atau server tidak merespons. Pernyataan itu telah dihentikan.
Kesalahan Sumber:
Pengecualian yang tidak tertangani dihasilkan selama eksekusi permintaan web saat ini. Informasi mengenai asal dan lokasi pengecualian dapat diidentifikasi menggunakan jejak tumpukan pengecualian di bawah ini.
Jejak Tumpukan:
[SqlException (0x80131904): Waktu tunggu habis. Periode waktu habis berlalu sebelum penyelesaian operasi atau server tidak merespons. Pernyataan tersebut telah diakhiri.]
System.Data.SqlClient.SqlConnection.OnError (SqlException pengecualian, Boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlCliver.Berikutnya. , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReaderAtara, apakah akan berjalan lebih baik jika dijalankan dengan senda
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand.Tingkah laku saat menjalankan sebuah perilaku, jika tidak, perilaku ini akan berjalan dengan perilaku yang lebih baik, jika tidak, perilaku, perilaku, perilaku, perilaku, atau perilaku. 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncHasil hasil, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMake String data) , Int32 & rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Obyek Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (Pengirim objek, EventArgs e) +163[HttpException (0x80004005): Waktu tunggu habis. Periode waktu habis berlalu sebelum penyelesaian operasi atau server tidak merespons. Pernyataan tersebut telah dihentikan.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext konteks, aplikasi HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionWithIIS (IntPtr apppertextttttttttttttttttpttpttpttppp.pdf)
. InitSpecial (status HttpApplicationState, MethodInfo [], IntPtr appContext, konteks HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, konteks HttpContext konteks) +407Peningkatan
ProyekPertama.Terkuat dengan ProyekPertambahan.[HttpException (0x80004005): Waktu tunggu habis. Periode waktu habis berlalu sebelum penyelesaian operasi atau server tidak merespons. Pernyataan tersebut telah diakhiri.]
System.Web.HttpRuntime.FirstRequestInit (HttpContextext) +11686928 System.Web.HttpRuntime.PastikanFirstRequestInit (HttpContext konteks) +141 System.Web.HttpRuntime.Teks teks KonteksAku
EDIT SETELAH JAWABAN:
saya Application_Start
di Global.asax
adalah seperti di bawah ini:
protected void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
OnlineUsers.Update_SessionEnd_And_Online(
DateTime.Now,
false);
AddTask("DoStuff", 10);
}
Prosedur tersimpan yang dipanggil adalah:
ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online]
@Session_End datetime,
@Online bit
As
Begin
Update OnlineUsers
SET
[Session_End] = @Session_End,
[Online] = @Online
End
Saya memiliki dua metode untuk mendapatkan pengguna online:
- menggunakan
Application["OnlineUsers"] = 0;
- yang lain menggunakan basis data
Jadi, untuk metode # 2 saya mengatur ulang semua Pengguna Online di Application_Start
. Ada lebih dari 482.751 catatan dalam tabel itu.
sumber
Jawaban:
Sepertinya Anda memiliki kueri yang membutuhkan waktu lebih lama dari yang seharusnya. Dari jejak stack dan kode Anda, Anda harus dapat menentukan dengan tepat apa itu query.
Jenis waktu habis ini dapat memiliki tiga penyebab;
Jalan buntu bisa sulit untuk diperbaiki, tetapi mudah untuk menentukan apakah itu masalahnya. Terhubung ke database Anda dengan Sql Server Management Studio. Di panel kiri klik kanan pada node server dan pilih Activity Monitor . Lihatlah proses yang sedang berjalan. Biasanya sebagian besar akan diam atau berjalan. Ketika masalah terjadi, Anda dapat mengidentifikasi proses yang diblokir oleh negara proses. Jika Anda mengklik kanan pada proses dan memilih detail itu akan menunjukkan kepada Anda permintaan terakhir yang dieksekusi oleh proses.
Masalah kedua akan menyebabkan database menggunakan rencana kueri yang tidak optimal. Itu dapat diatasi dengan menghapus statistik:
Jika itu tidak berhasil, Anda juga bisa mencoba
Anda seharusnya tidak melakukan ini ketika server Anda berada di bawah beban berat karena untuk sementara waktu akan menimbulkan hit kinerja yang besar karena semua procs dan kueri yang disimpan dikompilasi ulang ketika pertama kali dieksekusi. Namun, karena Anda menyatakan masalah terkadang terjadi , dan jejak tumpukan menunjukkan aplikasi Anda mulai, saya pikir Anda menjalankan kueri yang hanya dijalankan sesekali. Anda mungkin lebih baik dengan memaksa SQL Server untuk tidak menggunakan kembali rencana permintaan sebelumnya. Lihat jawaban ini untuk perincian tentang bagaimana melakukan itu.
Saya sudah menyentuh masalah ketiga, tetapi Anda dapat dengan mudah menentukan apakah kueri perlu disetel dengan menjalankan kueri secara manual, misalnya menggunakan Sql Server Management Studio. Jika kueri membutuhkan waktu terlalu lama untuk diselesaikan, bahkan setelah mengatur ulang statistik, Anda mungkin perlu menyetelnya. Untuk bantuan dengan itu, Anda harus memposting kueri yang tepat dalam pertanyaan baru.
sumber
exec sp_updatestats
memecahkan masalah saya. Terimakasih banyak!Dalam kode tempat Anda menjalankan prosedur tersimpan, Anda harus memiliki sesuatu seperti ini:
Tambahkan baris kode seperti itu:
Ini akan menunggu sebanyak waktu yang diperlukan agar operasi selesai.
sumber
Anda bisa mengatur
CommandTimeout
properti dari Perintah SQL untuk memungkinkan transaksi SQL berjalan lama.Anda mungkin juga perlu melihat SQL Query yang menyebabkan batas waktu.
sumber
Sementara semua tanggapan sebelumnya membahas masalah ini, mereka tidak mencakup semua kasus.
Microsoft telah mengakui masalah ini dan memperbaikinya pada 2011 untuk sistem operasi yang didukung, jadi jika Anda mendapatkan jejak tumpukan seperti:
Anda mungkin perlu memperbarui majelis .NET Anda.
Lihat KB 2605597 untuk detailnya
https://support.microsoft.com/kb/2605597
sumber
Mungkin itu akan bermanfaat bagi seseorang. Saya menghadapi masalah yang sama dan dalam kasus saya alasannya adalah SqlConnection dibuka dan tidak dibuang dalam metode yang saya panggil secara berulang dengan sekitar 2500 iterasi. Kolam koneksi habis. Pembuangan yang tepat memecahkan masalah.
sumber
using
blok) saya punya masalah batas waktu ini. Ini sepertinya menyelesaikannya.Saya menghadapi masalah yang sama bekerja di sekitar 3 hari. Saya perhatikan karena jumlah rekaman kami tidak banyak, pengembang senior kami menyimpan 2 gambar dan Sidik Jari di basis data. Ketika saya mencoba mengambil nilai hex ini butuh waktu lama, saya menghitung waktu rata-rata untuk menjalankan prosedur saya sekitar 38 detik. Commandtimeout default adalah 30 detik sehingga kurang dari waktu rata-rata yang diperlukan untuk menjalankan prosedur tersimpan saya. Saya mengatur timeout perintah saya seperti di bawah ini
dan itu berfungsi dengan baik tetapi kadang-kadang jika permintaan Anda membutuhkan lebih dari 50 detik itu akan meminta kesalahan yang sama.
sumber
Anda harus mengatur atribut CommandTimeout. Anda dapat mengatur atribut CommandTimeout di kelas anak DbContext.
sumber
Saya menemukan kesalahan ini baru-baru ini dan setelah beberapa penyelidikan singkat, menemukan penyebabnya karena kami kehabisan ruang pada disk yang memegang basis data (kurang dari 1GB).
Segera setelah saya memindahkan file database (.mdf dan .ldf) ke disk lain di server yang sama (dengan lebih banyak ruang), halaman yang sama (menjalankan kueri) yang telah habis waktu dimuat dalam tiga detik.
Satu hal lain untuk diselidiki, ketika mencoba menyelesaikan kesalahan ini, adalah ukuran file log basis data. File log Anda mungkin hanya perlu dikecilkan.
sumber
Saya memiliki masalah dengan perhitungan besar dalam sp_foo yang membutuhkan waktu besar jadi saya memperbaiki
dengan kode bit kecil ini
sumber
Batas waktu default adalah 15 detik, untuk mengubah itu, 0 tidak terbatas, angka lainnya adalah jumlah detik.
Dalam kode
Di Web.Config Anda, "Command Timeout = 0;" jangan jeda, atau di bawah 1 jam (3600 detik)
sumber
@ SilverLight .. Ini jelas masalah dengan objek Database. Ini bisa berupa kueri yang ditulis dengan buruk, atau indeks hilang. Tetapi sampai sekarang saya tidak akan menyarankan Anda untuk menambah batas waktu tanpa menyelidiki masalah dengan objek Database Anda
Letakkan breakpoint pada baris kode ini untuk menemukan nama prosedur dan kemudian mengoptimalkan prosedur dengan melihat rencana pelaksanaannya.
Saya tidak dapat membantu Anda lebih lanjut hingga saat Anda memposting detail tentang prosedur tersimpan.
sumber
mencoba
lalu bangun kembali indeks Anda
sumber
sumber
TLDR :
Saya sering menemui kesalahan ini karena berbagai alasan dan memiliki berbagai solusi, termasuk:
sumber
Pastikan juga Anda tidak memiliki transaksi yang tertunda. :)
Saya melakukan beberapa tes di sekitar dan memulai transaksi untuk menjadi aman tetapi tidak pernah menutupnya. Saya berharap kesalahannya akan lebih eksplisit tetapi oh well!
sumber
Kami mengalami masa-masa sulit
Timeout expired/max pool reached
Sqlexception
. Sebagai solusi dan untuk mencegah restart server atau layanan, kami memodifikasiMAX SERVER MEMORY
variabel dalam SQL Server (baik melalui SQL Managment Studio atau T-SQL):Ini sementara memperbaiki masalah sampai terjadi lagi. Dalam kasus kami, kami menduga itu ada hubungannya dengan kebocoran koneksi di tingkat aplikasi.
sumber
Kami baru-baru ini ditingkatkan ke versi NuGet dari
SqlClient
(Microsoft.Data.SqlClient
) yang berisi bug . Bug ini diperkenalkan selama siklus 1.x dan telah diperbaiki. Perbaikan akan tersedia dalam rilis 2.0.0 yang tidak tersedia pada saat penulisan ini. Pratinjau tersedia.Anda dapat memeriksa detailnya di sini: https://github.com/dotnet/SqlClient/issues/262
sumber