簡體   English   中英

停止Linq查詢是否需要太長時間

[英]Halt Linq query if it will take 'too' long

當前,我需要創建一個報告程序,該程序可以在SQL數據庫中的許多不同表上運行報告。 多個不同的客戶端需要此功能,但是某些客戶端具有比其他客戶端更大的數據庫。 我想知道的是,如果花費了太長時間,是否可以在一段時間后停止查詢。

為了提供一些上下文,一些客戶端的表超過200萬行,盡管不同的客戶端在同一表中可能只有5萬行。 我希望能夠運行查詢20秒鍾,如果還沒有完成查詢,則向用戶返回一條消息,說結果集將太大,並且需要像我們一樣在幾小時之外生成報告不想在白天運行資源密集型操作。

通過CommandTimeout屬性在連接字符串或DataContext上設置連接超時。 超時到期時,您將收到TimeoutException ,並且查詢將被取消。

您無法確定在發生超時的那一刻服務器上就會取消查詢,但是在大多數情況下,查詢會很快取消。 有關詳細信息,請閱讀出色的文章“沒有查詢超時...” 重要的部分是:

客戶端使用注意事件向服務器發出查詢超時信號。 注意事件只是SQL Server客戶端可以發送給它的TDS數據包的一種不同類型。 除了連接/斷開連接,T-SQL批處理和RPC事件外,客戶端還可以向服務器發出注意信號。 注意告訴服務器盡快取消連接的當前正在執行的查詢(如果存在)。 注意不會回滾打開的事務,也不會停止對一角錢的當前正在執行的查詢-服務器在下一個可用機會中止為連接所做的任何操作。 通常,這種情況很快發生,但並非總是如此。

但是請記住,它在提供程序之間會有所不同,甚至可能會在服務器版本之間發生變化。

如果在后台線程上運行查詢器,則可以輕松地做到這一點。 使主線程啟動計時器,並生成運行查詢的后台線程。 如果20秒過后,后台線程沒有返回結果,則主線程可以將其取消。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM