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


295

ฉันมีผู้ใช้จำนวนมากบนเว็บไซต์ของฉัน (20,000-60000 ต่อวัน) ซึ่งเป็นเว็บไซต์ดาวน์โหลดสำหรับไฟล์มือถือ ฉันเข้าถึงเซิร์ฟเวอร์ของฉันจากระยะไกล (เซิร์ฟเวอร์ windows 2008-R2)
ฉันได้รับข้อผิดพลาด"เซิร์ฟเวอร์ไม่พร้อมใช้งาน"ก่อนหน้านี้ แต่ตอนนี้ฉันเห็นข้อผิดพลาดการหมดเวลาเชื่อมต่อ
ฉันไม่คุ้นเคยกับสิ่งนี้ - ทำไมจึงเกิดขึ้นและฉันจะแก้ไขได้อย่างไร

ข้อผิดพลาดเต็มอยู่ด้านล่าง:

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

รายละเอียดข้อยกเว้น: System.Data.SqlClient.SqlException: การหมดเวลาหมดอายุแล้ว รอบระยะเวลาการหมดเวลาผ่านไปก่อนที่การดำเนินการจะเสร็จสิ้นหรือเซิร์ฟเวอร์ไม่ตอบสนอง คำสั่งถูกยกเลิก

ข้อผิดพลาดของแหล่งที่มา:

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

กองติดตาม:

[SqlException (0x80131904): การหมดเวลาหมดอายุแล้ว รอบระยะเวลาการหมดเวลาผ่านไปก่อนที่การดำเนินการจะเสร็จสิ้นหรือเซิร์ฟเวอร์ไม่ตอบสนอง คำสั่งถูกยกเลิก]
System.Data.SqlClient.SqlConnectionOnError (ข้อยกเว้น SqlException, บูลีน breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsParser.RunBehavior , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet BulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, วิธีการเรียกใช้ผู้ช่วยให้รอด, runBehavior, ผู้เรียกคืนผู้ช่วยให้รอด), Boolean async) +6389442
System.Data.SqlClient.SqlCommand 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (ผลลัพธ์ DbAsyncResultParPerPerPerName สตริงสตริงที่ชื่อพารามิเตอร์วิธีการบูลีน sendToPipe) +689
System.Data.SqlClient.SqlCommand.External
พารามิเตอร์ , Int32 & RowAffected) +209
DataLayerOnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (ผู้ส่งออบเจกต์, EventArgs e) +163

[HttpException (0x80004005): การหมดเวลาหมดอายุแล้ว รอบระยะเวลาการหมดเวลาผ่านไปก่อนที่การดำเนินการจะเสร็จสิ้นหรือเซิร์ฟเวอร์ไม่ตอบสนอง คำสั่งถูกยกเลิก]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (บริบทบริบท HttpApp บริบท) HttpApplication แอป HttpApplication
+4052053
System.WebHttpApplication.RegisterEventSubscriptions InitSpecial (สถานะ HttpApplicationState, ตัวจัดการเมธอดInfo [], IntPtr appContext, บริบทของ HttpContextPortialPinial +352
System.WebHttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext บริบทบริบทของ HttpContext
)

[HttpException (0x80004005): การหมดเวลาหมดอายุแล้ว รอบระยะเวลาการหมดเวลาผ่านไปก่อนที่การดำเนินการจะเสร็จสิ้นหรือเซิร์ฟเวอร์ไม่ตอบสนอง คำสั่งถูกยกเลิก]
System.Web.HttpRuntime.FirstRequestInit (บริบท HttpContext บริบท +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (บริบท HttpContextNat48)


แก้ไขหลังจากคำตอบ:
ฉันApplication_StartในGlobal.asaxเป็นเหมือนด้านล่าง:

protected void Application_Start(object sender, EventArgs e)
{
    Application["OnlineUsers"] = 0;

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

ขั้นตอนการจัดเก็บที่ถูกเรียกคือ:

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

ฉันมีสองวิธีในการรับผู้ใช้ออนไลน์:

  1. การใช้ Application["OnlineUsers"] = 0;
  2. อีกอันหนึ่งใช้ฐานข้อมูล

ดังนั้นสำหรับวิธี # 2 ผมรีเซ็ต OnlineUsers Application_Startทั้งหมดใน มีบันทึกมากกว่า 482,751 รายการในตารางนั้น


1
ตามที่กล่าวไว้ที่นี่ค่าเริ่มต้นคือ 15 วินาที
V4Vendetta

1
ดีกว่าที่จะทำการวิเคราะห์สาเหตุที่แท้จริงมีสาเหตุหลายประการที่ทำให้เกิดปัญหาดังกล่าว พื้นฐานส่วนใหญ่เป็นโครงสร้างที่ซับซ้อนของแบบสอบถาม ฉันประสบปัญหาเดียวกันเมื่อดึงข้อมูลรูปภาพที่เก็บไว้เป็นค่า Hex ในตาราง
Vijay Kumbhoje

นอกเหนือจากสาเหตุข้างต้นฉันจะเพิ่มอีกหนึ่งรายการ: การหมดเวลาการล็อก: docs.microsoft.com/en-us/sql/t-sql/statements/…หากเธรดนี้รอการล็อคนานเกินไปก็จะหมดเวลาตาม เอกสารด้านบน
เฮอร์เบิร์ตยู

คำตอบ:


344

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

การหมดเวลาแบบนี้อาจมีสาเหตุได้สามประการ

  1. มีการหยุดชะงักที่ไหนสักแห่ง
  2. สถิติของฐานข้อมูลและ / หรือแคชแผนแบบสอบถามไม่ถูกต้อง
  3. แบบสอบถามมีความซับซ้อนเกินไปและจำเป็นต้องปรับแต่ง

การปิดตายอาจเป็นเรื่องยากที่จะแก้ไข แต่มันง่ายที่จะตรวจสอบว่าเป็นกรณี เชื่อมต่อกับฐานข้อมูลของคุณด้วย Sql Server Management Studio ในบานหน้าต่างด้านซ้ายคลิกขวาที่โหนดเซิร์ฟเวอร์และเลือกกิจกรรมการตรวจสอบ ลองดูกระบวนการที่กำลังทำงานอยู่ โดยทั่วไปส่วนใหญ่จะว่างหรือทำงานอยู่ เมื่อปัญหาเกิดขึ้นคุณสามารถระบุกระบวนการที่ถูกบล็อกโดยสถานะของกระบวนการ หากคุณคลิกขวาที่กระบวนการและเลือกรายละเอียดระบบจะแสดงข้อความค้นหาล่าสุดที่ดำเนินการโดยกระบวนการ

ปัญหาที่สองจะทำให้ฐานข้อมูลใช้แผนการสอบถามย่อยที่ดีที่สุด สามารถแก้ไขได้โดยการล้างสถิติ:

exec sp_updatestats

หากไม่ได้ผลคุณสามารถลอง

dbcc freeproccache

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

ฉันได้สัมผัสกับปัญหาที่สามแล้ว แต่คุณสามารถกำหนดได้อย่างง่ายดายว่าแบบสอบถามต้องการปรับแต่งหรือไม่โดยการดำเนินการสืบค้นด้วยตนเองเช่นใช้ Sql Server Management Studio หากแบบสอบถามใช้เวลาในการดำเนินการนานเกินไปแม้หลังจากรีเซ็ตสถิติแล้วคุณอาจต้องปรับแต่ง สำหรับความช่วยเหลือคุณควรโพสต์ข้อความค้นหาที่แน่นอนในคำถามใหม่


39
ฉันมีข้อผิดพลาดเดียวกันนี้ แต่ในแบบสอบถามที่ 'เพิ่ง' เอา 8secs ... และเคล็ดลับของคุณเกี่ยวกับการexec sp_updatestatsแก้ไขปัญหาของฉัน ขอบคุณมาก!
nrod

2
การแก้ปัญหาเช่นนี้แทบจะไม่เป็นเรื่องของการหมดเวลาปรับแต่งหรือขนาดพูลการเชื่อมต่อ คุณจะต้องดำน้ำและหาสาเหตุที่แท้จริง หากคุณต้องการความช่วยเหลือในการแก้ไขสาเหตุดังกล่าวคุณสามารถโพสต์คำถามของคุณเอง
Marnix van Valen

5
นี่ไม่ใช่การหยุดชะงักอย่างแน่นอน อาจเกิดจากการบล็อกมากเกินไป แต่การหยุดชะงักจะได้รับการแก้ไขภายในไม่กี่วินาที นี่อาจเป็นการบล็อกมากเกินไป แต่ไม่ใช่การหยุดชะงัก
Michael J Swart

1
เราแน่ใจหรือไม่ว่านี่คือการหมดเวลาของคำสั่งและไม่ใช่การหมดเวลาเชื่อมต่อ "System.Data.SqlClient.SqlConnectionOnError" ถึงฉันบ่งบอกถึงปัญหาการเชื่อมต่อ
Mike W

1
@PrashantPimpale มันขึ้นอยู่กับว่าคุณมีปัญหาร้ายแรงในการผลิตซึ่งสถิติที่ไม่ถูกต้องส่งผลให้เกิดแผนการดำเนินการที่ไม่ถูกต้องใช่นี่อาจเป็นทางออก ยกเว้นปัญหาพิเศษ (เช่นความล้มเหลวของฮาร์ดแวร์) การอัปเดตสถิติจะไม่ทำลายฐานข้อมูลของคุณ มันอาจทำให้การสืบค้นช้าลงเล็กน้อย ในท้ายที่สุดมันเป็นสายของคุณ
Marnix van Valen

155

ในรหัสของคุณที่คุณเรียกใช้กระบวนงานที่เก็บไว้คุณควรมีดังนี้:

SqlCommand c = new SqlCommand(...)
//...

เพิ่มบรรทัดของรหัสดังกล่าว:

c.CommandTimeout = 0;

นี้จะรอเวลามากเท่าที่จำเป็นสำหรับการดำเนินการให้เสร็จสมบูรณ์


143
คุณควรทราบว่าไม่แนะนำค่า 0 : ค่า 0 บ่งชี้ไม่ จำกัด และควรหลีกเลี่ยงใน CommandTimeout เนื่องจากความพยายามในการดำเนินการคำสั่งจะรออย่างไม่มีกำหนด เป็นการดีกว่าที่จะเรียนรู้ว่าต้องใช้เวลานานเท่าใดและเพิ่มค่าการหมดเวลาหากจำเป็น
Otiel

7
ฉันเห็นด้วยกับ Otiel และ downvote คำตอบของคุณ: เมื่อตั้งค่า commandTimeout เป็น 0 คุณจะไม่ให้โอกาสผู้กู้เว็บเซิร์ฟเวอร์กู้คืนจากเซิร์ฟเวอร์ฐานข้อมูลที่ไม่ตอบสนอง ประการที่สองเมื่อคุณกดปุ่มหมดเวลาเริ่มต้นคุณควรพิจารณาสาเหตุ ในกรณีส่วนใหญ่การแก้ไขแบบสอบถามจะดีกว่าการเพิ่มเวลาหมดเวลา
Maarten Kieft

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

2
ใช่สำหรับการถ่ายโอนข้อมูลขนาดใหญ่ที่ไม่ได้ตั้งค่าสิ่งนี้ไม่สมเหตุสมผล หากคุณถ่ายโอนแถวหลายล้านแถวสิ่งที่ Otiel และ BlackHawkDesign กำลังพูดนั้นไม่สมเหตุสมผล
bluerubez

ใน 20 ปีของการพัฒนาข้อมูลเป็นศูนย์กลางฉันไม่เคยต้องการทำสิ่งนี้ มีวิธีการที่เรียบง่ายพอสมควรซึ่งให้ประสิทธิภาพที่ดีกว่าและไม่ได้สร้างโอกาสสำหรับกระบวนการเดียวที่จะทำการบดบังฐานข้อมูลตลอดทั้งวัน ปัญหาประสิทธิภาพฐานข้อมูลส่วนใหญ่สามารถปรับไปยังจุดที่พวกเขาดำเนินการลำดับของขนาดได้เร็วขึ้น นั่นคือกระบวนการที่คุณรอให้เสร็จสมบูรณ์ 3 ชั่วโมงอาจจะปรับเป็น 3 นาทีหรือ 3 วินาที
b_levitt

25

คุณสามารถตั้งค่าCommandTimeoutคุณสมบัติของคำสั่ง SQL เพื่อให้สามารถทำธุรกรรม SQL ที่รันนาน

คุณอาจต้องดู SQL Query ที่เป็นสาเหตุของการหมดเวลา


สวัสดี "หรือคุณต้องดู SQL Query ที่ทำให้การหมดเวลา" -> ใน sql server 2008 ที่ฉันควรตรวจสอบการหมดเวลานั้นหรือไม่
SilverLight

คุณอาจต้องทดสอบกระบวนงานที่เก็บไว้ที่เรียกจาก DataLayerOnlineUsers.Update_SessionEnd_And_Online เนื่องจาก Stack Trace ดูเหมือนจะชี้ไปทางนั้น นำสำเนาของฐานข้อมูลสดมาทดสอบและเรียกใช้ Stored Procedure ผ่านพารามิเตอร์ที่จำเป็นหากใช้เวลานานกว่า 30 วินาทีจึงจะเสร็จสมบูรณ์นั่นคือสาเหตุที่คุณหมดเวลา ฉันสมมติว่าคุณมีสิทธิ์เข้าถึง SQL Server Management Studio
Kev Ritchie

ใช่ฉันมีสิทธิ์เข้าถึง sql server 2008 ฉันควรลองวิธีของคุณ
SilverLight

หากคุณพบโพรซีเดอร์ที่เก็บที่ทำให้เกิดปัญหาคุณสามารถรันเคียวรีที่มีอยู่ในโพรซีเดอร์ที่เก็บไว้ผ่าน Database Tuning Adviser ซึ่งจะแนะนำถ้าคุณต้องการดัชนีใด ๆ ฯลฯ ลิงก์ที่นี่msdn.microsoft.com/en-us/library /ms174202.aspx
Kev Ritchie

12

ในขณะที่การตอบสนองก่อนหน้าทั้งหมดแก้ไขปัญหาที่พวกเขาไม่ครอบคลุมทุกกรณี

Microsoft ได้รับทราบปัญหาและแก้ไขในปี 2011 สำหรับระบบปฏิบัติการที่รองรับดังนั้นหากคุณได้รับ stack trace เช่น:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)

คุณอาจจำเป็นต้องอัพเดตชุดประกอบ. NET ของคุณ

ปัญหานี้เกิดขึ้นเนื่องจากมีข้อผิดพลาดในอัลกอริทึมลองการเชื่อมต่อสำหรับฐานข้อมูลที่มิเรอร์

เมื่อใช้อัลกอริธึมการลองใหม่ผู้ให้บริการข้อมูลจะรอการเรียกเพื่ออ่าน (SniReadSync) ครั้งแรกให้เสร็จ การโทรถูกส่งไปยังคอมพิวเตอร์แบ็คเอนด์ที่ใช้ SQL Server และเวลารอคอยจะคำนวณโดยการคูณค่าการหมดเวลาการเชื่อมต่อด้วย 0.08 อย่างไรก็ตามผู้ให้บริการข้อมูลตั้งค่าการเชื่อมต่อไม่ถูกต้องให้อยู่ในสถานะที่กำหนดอีกต่อไปหากการตอบสนองช้าและหากการเรียก SniReadSync ครั้งแรกไม่เสร็จสมบูรณ์ก่อนเวลารอจะหมดอายุ

ดู KB 2605597 สำหรับรายละเอียด

https://support.microsoft.com/kb/2605597


9

บางทีมันอาจจะมีประโยชน์สำหรับใครบางคน ฉันประสบกับปัญหาเดียวกันและในกรณีของฉันเหตุผลคือการเปิด SqlConnection และไม่ได้จำหน่ายในวิธีการที่ฉันเรียกว่าวนซ้ำกับประมาณ 2500 iterations พูลการเชื่อมต่อหมดแล้ว การกำจัดที่เหมาะสมแก้ไขปัญหา


นี้! ตรงนี้ ปัญหาของฉันคือฉันกำลัง firing off วิธีการในเธรดอื่นโดยไม่ต้องรอ (เนื่องจากผู้ใช้ไม่ต้องการผลลัพธ์ของวิธีนั้นสคริปต์พื้นหลัง) โดยไม่ต้องกำจัด (ใช้ประโยชน์จากusingบล็อก) ฉันมีปัญหาหมดเวลานี้ ดูเหมือนว่าจะแก้ปัญหาได้
CularBytes

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

8

ฉันประสบปัญหาเดียวกันทำงานกับมันประมาณ 3 วัน ฉันสังเกตเห็นว่าจำนวนบันทึกของเรามีไม่มากนักพัฒนาอาวุโสของเราเก็บภาพและลายนิ้วมือ 2 ไว้ในฐานข้อมูล เมื่อฉันพยายามที่จะดึงค่าฐานสิบหกนี้มันใช้เวลานานฉันคำนวณเวลาเฉลี่ยในการดำเนินการตามขั้นตอนของฉันมันประมาณ 38 วินาที commandtimeout เริ่มต้นคือ 30 วินาทีดังนั้นจึงใช้เวลาน้อยกว่าเวลาเฉลี่ยในการเรียกใช้โพรซีเดอร์ที่ฉันจัดเก็บไว้ ฉันตั้งค่าไทม์เอาท์ของฉันตามด้านล่าง

cmd.CommandTimeout = 50

และมันใช้งานได้ดี แต่บางครั้งถ้าคำค้นหาของคุณใช้เวลานานกว่า 50 วินาทีมันจะแจ้งข้อผิดพลาดเดียวกัน


8

คุณต้องตั้งค่าแอตทริบิวต์ CommandTimeout คุณสามารถตั้งค่าแอตทริบิวต์ CommandTimeout ในคลาสลูก DbContext

public partial class StudentDatabaseEntities : DbContext
{
    public StudentDatabaseEntities()
        : base("name=StudentDatabaseEntities")
    {
        this.Database.CommandTimeout = 180;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<StudentDbTable> StudentDbTables { get; set; }
}

4

ฉันพบข้อผิดพลาดนี้เมื่อเร็ว ๆ นี้และหลังจากการตรวจสอบสั้น ๆ พบสาเหตุที่ทำให้เรามีพื้นที่ว่างในดิสก์ที่เก็บฐานข้อมูล (น้อยกว่า 1GB)

ทันทีที่ฉันย้ายไฟล์ฐานข้อมูล (.mdf และ. ldd) ไปยังดิสก์อื่นบนเซิร์ฟเวอร์เดียวกัน (ที่มีพื้นที่มากขึ้น) หน้าเดียวกัน (เรียกใช้แบบสอบถาม) ที่โหลดหมดเวลาภายในสามวินาที

อีกสิ่งหนึ่งที่ต้องตรวจสอบขณะพยายามแก้ไขข้อผิดพลาดนี้คือขนาดของไฟล์บันทึกฐานข้อมูล ไฟล์บันทึกของคุณอาจต้องถูกย่อ


3

ฉันมีปัญหากับการคำนวณจำนวนมากใน sp_foo ที่ใช้เวลามากดังนั้นฉันจึงแก้ไข
ด้วยรหัสบิตนี้

public partial class FooEntities : DbContext
{
   public FooEntities()
         : base("name=FooEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // Sets the command timeout for all the commands
        objectContext.CommandTimeout = 380;
    }

3

การหมดเวลาเริ่มต้นคือ 15 วินาทีหากต้องการเปลี่ยนนั้น 0 จะไม่ จำกัด จำนวนอื่นใดคือจำนวนวินาที

ในรหัส

using (SqlCommand sqlCmd = new SqlCommand(sqlQueryString, sqlConnection))
   {
      sqlCmd.CommandTimeout = 0; // 0 = give it as much time as it needs to complete
      ...
    }

ในเว็บของคุณตั้งค่า "Command Timeout = 0;" อย่าหมดเวลาหรือต่ำกว่า 1 ชั่วโมง (3600 วินาที)

  <add name="ConnectionString" connectionString="Data Source=ServerName;User ID=UserName;Password=Password;Command Timeout=3600;" providerName="System.Data.SqlClient" />

2
นั่นคือการหมดเวลาที่แตกต่างกันสองแบบ คำแนะนำแรกของคุณตอบคำถาม ที่สองของคุณจะใช้งานได้หากผู้ให้บริการเชื่อมต่อรองรับซึ่ง SqlClient ไม่ได้ ไม่ว่าเวลาใดก็ตามการหมดเวลาของ 0 จะไม่เป็นความคิดที่ดีในการผลิต 30 วินาทีเป็นค่าเริ่มต้นตามปกติ
Suncat2000

2

@SilverLight .. นี่เป็นปัญหาของวัตถุฐานข้อมูลอย่างชัดเจน มันอาจเป็นแบบสอบถามที่เขียนไม่ดีหรือดัชนีหายไป แต่ ณ ตอนนี้ฉันจะไม่แนะนำให้คุณเพิ่มการหมดเวลาโดยไม่ต้องตรวจสอบปัญหากับวัตถุฐานข้อมูลของคุณ

NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209

วางเบรกพอยต์บนบรรทัดโค้ดนี้เพื่อค้นหาชื่อโพรซีเดอร์จากนั้นปรับโพรซีเดอร์ให้เหมาะสมโดยดูที่แผนการดำเนินการ

ฉันไม่สามารถช่วยคุณได้มากขึ้นจนถึงเวลาที่คุณโพสต์รายละเอียดเกี่ยวกับขั้นตอนการจัดเก็บ


กระบวนงานที่เก็บไว้ไม่ได้ทำสิ่งแฟนซี อย่างไรก็ตามดูเหมือนว่าตาราง OnlineUsers จะถูกล็อคในขณะที่กำลังดำเนินการขั้นตอน ลองใช้ตัวสร้างโปรไฟล์ SQL เพื่อดูว่าเกิดอะไรขึ้นที่ Application_Start
Amit Rai Sharma

2

ลอง

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

จากนั้นสร้างดัชนีของคุณใหม่


8
คุณช่วยอธิบายวิธีแก้ปัญหาของคุณได้ไหม?
Hp93

0

การหมดเวลาหมดอายุเนื่องจากแบบสอบถาม sql ใช้เวลามากกว่าที่คุณตั้งไว้ในคุณสมบัติ sqlCommand.CommandTimeout

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


0

TLDR :

  1. การรีบูตทั้งแอปพลิเคชันและเซิร์ฟเวอร์ DB เป็นการแก้ไขที่รวดเร็วที่สุดโดยที่ปริมาณข้อมูลการตั้งค่าเครือข่ายและรหัสไม่เปลี่ยนแปลง เรามักจะทำตามกฎ
  2. อาจเป็นตัวบ่งชี้ความล้มเหลวของฮาร์ดไดรฟ์ที่ต้องเปลี่ยน - ตรวจสอบการแจ้งเตือนของระบบ

ฉันมักจะพบข้อผิดพลาดนี้ด้วยเหตุผลต่าง ๆ และมีวิธีแก้ไขปัญหาต่าง ๆ รวมถึง:

  1. refactoring รหัสของฉันเพื่อใช้SqlBulkCopy
  2. การเพิ่มค่าการหมดเวลาตามที่ระบุไว้ในคำตอบหรือการตรวจสอบสาเหตุพื้นฐานต่างๆ ( อาจไม่เกี่ยวข้องกับข้อมูล )
  3. การเชื่อมต่อหมดเวลา (ค่าเริ่มต้น 15 วินาที) - ใช้เวลานานเท่าใดในการรอการเชื่อมต่อที่จะสร้างขึ้นกับเซิร์ฟเวอร์ SQL ก่อนที่จะยกเลิก - เกี่ยวข้องกับ TCP / PORT - สามารถผ่านรายการตรวจสอบการแก้ไขปัญหา (บทความ MSDN ที่มีประโยชน์มาก)
  4. Command Timeout (Default 30s) - ใช้เวลานานเท่าใดในการรอการดำเนินการค้นหา - การดำเนินการแบบสอบถาม / ปริมาณการใช้เครือข่ายที่เกี่ยวข้อง - ยังมีกระบวนการแก้ไขปัญหา (บทความ MSDN ที่มีประโยชน์มาก)
  5. การรีบูตเซิร์ฟเวอร์ - ทั้งแอปพลิเคชัน & เซิร์ฟเวอร์ DB (ถ้าแยกต่างหาก) - โดยที่รหัสและข้อมูลไม่ได้เปลี่ยนแปลงสภาพแวดล้อมต้องเปลี่ยน - สิ่งแรกที่คุณต้องทำ โดยทั่วไปเกิดจากโปรแกรมแก้ไข (ระบบปฏิบัติการ,. Net Framework หรือโปรแกรมปรับปรุงหรือปรับปรุง SQL Server) โดยเฉพาะอย่างยิ่งถ้าข้อยกเว้นการหมดเวลาปรากฏขึ้นด้านล่าง (แม้ว่าเราจะไม่ใช้ Azure):
    • System.Data.Entity.Core.EntityException: มีการยกข้อยกเว้นที่น่าจะเกิดจากความล้มเหลวชั่วคราว หากคุณกำลังเชื่อมต่อกับฐานข้อมูล SQL Azure ให้พิจารณาใช้ SqlAzureExecutionStrategy ---> System.Data.Entity.Core.EntityCommandExecutionException: มีข้อผิดพลาดเกิดขึ้นขณะดำเนินการกำหนดคำสั่ง ดูข้อยกเว้นภายในสำหรับรายละเอียด ---> System.Data.SqlClient.SqlException: เกิดข้อผิดพลาดระดับการขนส่งเมื่อได้รับผลลัพธ์จากเซิร์ฟเวอร์ (ผู้ให้บริการ: ผู้ให้บริการ TCP ข้อผิดพลาด: 0 - รอบระยะเวลาการหมดเวลาเซมาฟอร์หมดอายุแล้ว) ---> System.ComponentModel.Win32Exception: รอบระยะเวลาการหมดเวลาของเซมาฟอร์หมดอายุแล้ว

0

ตรวจสอบให้แน่ใจว่าคุณไม่มีธุรกรรมที่รอดำเนินการ :)

ฉันกำลังทำการทดสอบและเริ่มทำธุรกรรมเพื่อความปลอดภัย แต่ไม่เคยปิดมัน ฉันหวังว่าข้อผิดพลาดจะชัดเจนมากขึ้น แต่ก็ดี!


0

Timeout expired/max pool reached Sqlexceptionเราได้มีเวลาที่ยากลำบากใน เพื่อเป็นการหลีกเลี่ยงปัญหาและเพื่อป้องกันการรีสตาร์ทเซิร์ฟเวอร์หรือบริการที่เราปรับเปลี่ยนMAX SERVER MEMORYตัวแปรใน SQL Server (ผ่าน SQL Managment Studio หรือ T-SQL):

DECLARE @maxMem INT = 3000 --Max. memory for SQL Server instance in MB
EXEC sp_configure 'show advanced options', 1
RECONFIGURE

สิ่งนี้จะแก้ไขปัญหาชั่วคราวจนกว่าจะเกิดขึ้นอีกครั้ง ในกรณีของเราเราสงสัยว่าเกี่ยวข้องกับการรั่วไหลของการเชื่อมต่อในระดับแอป


0

เราเพิ่งอัพเกรดเป็น NuGet รุ่นของSqlClient( Microsoft.Data.SqlClient) ซึ่งมีข้อบกพร่องซึ่งมีข้อผิดพลาด ข้อผิดพลาดนี้ถูกนำเสนอในช่วงอายุการใช้งานของรอบ 1.x และได้รับการแก้ไขแล้ว การแก้ไขจะมีให้ในรุ่น 2.0.0 ซึ่งไม่สามารถใช้งานได้ในขณะที่เขียนนี้ ดูตัวอย่างได้

คุณสามารถตรวจสอบรายละเอียดได้ที่นี่: https://github.com/dotnet/SqlClient/issues/262

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