簡體   English   中英

在數據庫調用之間共享ASP.NET Web App中的SqlConnection對象

[英]Share SqlConnection object in ASP.NET Web App Between DB calls

是否有一種方法可以有效地在至少來自同一頁面或同一請求或整個應用程序的調用之間共享單個SqlConnection實例?

如果您正在使用ADO.NET或利用任何框架ADO.NET ,那么它很可能已經連接池為您服務。

您正在使用什么數據庫? -連接池可能會根據數據庫類型而有所不同。

您始終可以通過監視數據庫服務器連接來驗證這一點。

例如,在SQL Server上, sp_who2將列出所有連接。 在您的計算機上查找連接,並注意到在Web應用程序頁面加載之間, spid (每個連接的唯一標識)保持不變。

如果您想知道如何做到這一點,答案是通過在頁面內部聲明一個SqlConnection類型的靜態變量,並將其用於所有頁面方法中的數據庫訪問。 但是, 這是一個可怕的想法 ,原因很多:

  1. 正如許多人指出的那樣,SQLConnections是池化的,因此無需嘗試避免為每個數據庫訪問打開連接。 這樣做不會提高性能。

  2. 請記住,對您的應用程序的每個請求都將由來自應用程序池的不同線程來處理。 如果您有這樣的靜態變量,則對同一頁面的2個並發請求可能最終訪問同一SqlConnection實例,並且您可能會遇到以下情況:第二個請求正在從數據庫中檢索數據時,第一個請求可能會關閉連接意外。

  3. 您應該在應用程序體系結構的不同層上執行數據訪問操作。 一個好的方法是擁有一個業務層,該業務層引用一個應用程序數據訪問層,而該應用程序又負責執行數據訪問操作。 這提供了更大的封裝,關注點分離並提高了可維護性,可重用性等。 這是一篇很好的文章,對這一想法進行了說明。

那真是個壞主意。 SqlConnection實現IDisposable ,這意味着您必須將其處置以盡快釋放資源。

如前所述,引擎蓋下的連接池已經優化了連接的創建。 如果您開始保持連接,可能會遇到嚴重的問題,我一次又一次看到它。

暫無
暫無

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

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