• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            君子性非異也,善假于物也。

            如有恒,何須三更起,半夜眠;最怕莫,三天打魚兩天曬網,竹籃打水一場空!
            posts - 31, comments - 23, trackbacks - 0, articles - 30
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            [MSDN]使用連接池

            Posted on 2007-12-21 01:33 neter 閱讀(500) 評論(0)  編輯 收藏 引用 所屬分類: 程序設計
            使用連接池

            連接到數據庫服務器通常由幾個需要很長時間的步驟組成。必須建立物理通道(例如套接字或命名管道),必須與服務器進行初次握手,必須分析連接字符串信息,必須由服務器對連接進行身份驗證,必須運行檢查以便在當前事務中登記,等等。

            實際上,大多數應用程序僅使用一個或幾個不同的連接配置。這意味著在執行應用程序期間,許多相同的連接將反復地打開和關閉。為了使打開的連接成本最低,ADO.NET 使用稱為連接池的優化方法。

            連接池減少新連接需要打開的次數。池進程保持物理連接的所有權。通過為每個給定的連接配置保留一組活動連接來管理連接。只要用戶在連接上調用 Open,池進程就會檢查池中是否有可用的連接。如果某個池連接可用,會將該連接返回給調用者,而不是打開新連接。應用程序在該連接上調用 Close 時,池進程會將連接返回到活動連接池集中,而不是真正關閉連接。連接返回到池中之后,即可在下一個 Open 調用中重復使用。

            只有配置相同的連接可以建立池連接。ADO.NET 同時保留多個池,每個配置一個池。連接由連接字符串以及 Windows 標識(在使用集成的安全性時)分為多個池。

            池連接可以大大提高應用程序的性能和可縮放性。默認情況下,ADO.NET 中啟用連接池。除非顯式禁用,否則,連接在應用程序中打開和關閉時,池進程將對連接進行優化。還可以提供幾個連接字符串修飾符來控制連接池的行為。有關更多信息,請參見本主題后面的“使用連接字符串關鍵字控制連接池”。

            池的創建和分配

            在初次打開連接時,將根據完全匹配算法創建連接池,該算法將池與連接中的連接字符串關聯。每個連接池與不同的連接字符串關聯。打開新連接時,如果連接字符串并非與現有池完全匹配,將創建一個新池。按進程、按應用程序域、按連接字符串以及(在使用集成的安全性時)按 Windows 標識來建立池連接。

            在以下 C# 示例中創建了三個新的 SqlConnection 對象,但是管理時只需要兩個連接池。注意,根據為 Initial Catalog 分配的值,第一個和第二個連接字符串有所不同。

            using (SqlConnection connection = new SqlConnection(
            "Integrated Security=SSPI;Initial Catalog=Northwind"))
            {
            connection.Open();
            // Pool A is created.
            }
            using (SqlConnection connection = new SqlConnection(
            "Integrated Security=SSPI;Initial Catalog=pubs"))
            {
            connection.Open();
            // Pool B is created because the connection strings differ.
            }
            using (SqlConnection connection = new SqlConnection(
            "Integrated Security=SSPI;Initial Catalog=Northwind"))
            {
            connection.Open();
            // The connection string matches pool A.
            }

            如果 MinPoolSize 在連接字符串中未指定或指定為零,池中的連接將在一段時間不活動后關閉。但是,如果指定的 MinPoolSize 大于零,在 AppDomain 被卸載并且進程結束之前,連接池不會被破壞。非活動或空池的維護只需要最少的系統開銷。

            Note注意

            如果發生致命錯誤(例如故障轉移或注冊表中的別名更改),池將自動清除。

            添加連接

            連接池是為每個唯一的連接字符串創建的。當創建一個池后,將創建多個連接對象并將其添加到該池中,以滿足最小池大小的要求。連接根據需要添加到池中,但是不能超過指定的最大池大小(默認值為 100)。連接在關閉或斷開時釋放回池中。

            在請求 SqlConnection 對象時,如果存在可用的連接,將從池中獲取該對象。連接要可用,必須未使用,具有匹配的事務上下文或未與任何事務上下文關聯,并且具有與服務器的有效鏈接。

            連接池進程通過在連接釋放回池中時重新分配連接,來滿足這些連接請求。如果已達到最大池大小且不存在可用的連接,則該請求將會排隊。然后,池進程嘗試重新建立任何連接,直到到達超時時間(默認值為 15 秒)。如果池進程在連接超時之前無法滿足請求,將引發異常。

            Caution note警告

            我們建議您在使用完連接時一定要關閉連接,以便連接可以返回池。要關閉連接,可以使用 Connection 對象的 Close 或 Dispose 方法,也可以通過在 C# 的 using 語句中或在 Visual Basic 的 Using 語句中打開所有連接。不是顯式關閉的連接可能不會添加或返回到池中。例如,如果連接已超出范圍但沒有顯式關閉,則僅當達到最大池大小而該連接仍然有效時,該連接才會返回到連接池中。有關更多信息,請參見 Visual Basic 的using 語句(C# 參考)如何:釋放系統資源

            Note注意

            不要在類的 Finalize 方法中對 Connection、DataReader 或任何其他托管對象調用 Close 或 Dispose。在終結器中,僅釋放類直接擁有的非托管資源。如果類不擁有任何非托管資源,則不要在類定義中包含 Finalize 方法。有關更多信息,請參見垃圾回收

            移除連接

            連接池進程定期掃描連接池,查找沒有通過 Close 或 Dispose 關閉的未用連接,并重新建立找到的連接。如果應用程序沒有顯式關閉或斷開其連接,連接池進程可能需要很長時間才能重新建立連接,所以,最好確保在連接中顯式調用 Close 和 Dispose。

            如果連接長時間空閑,或池進程檢測到與服務器的連接已斷開,連接池進程會將該連接從池中移除。注意,只有在嘗試與服務器進行通信之后才能檢測到斷開的連接。如果發現某連接不再連接到服務器,則會將其標記為無效。無效連接只有在關閉或重新建立后,才會從連接池中移除。

            如果存在與已消失的服務器的連接,那么即使連接池管理程序未檢測到已斷開的連接并將其標記為無效,仍有可能將此連接從池中取出。這種情況是因為檢查連接是否仍有效的系統開銷將造成與服務器的另一次往返,從而抵消了池進程的優勢。發生此情況時,初次嘗試使用該連接將檢測連接是否曾斷開,并引發異常。

            清除池

            ADO.NET 2.0 引入了兩種新的方法來清除池:ClearAllPoolsClearPool。ClearAllPools 清除給定提供程序的連接池,ClearPool 清除與特定連接關聯的連接池。如果在調用時連接正在使用,將進行相應的標記。連接關閉時,將被丟棄,而不是返回池中。

            事務支持

            連接是根據事務上下文來從池中取出并進行分配的。除非在連接字符串中指定了 Enlist=false,否則,連接池將確保連接在 Current 上下文中登記。如果連接使用登記的 System.Transactions 事務關閉并返回池中,連接將保留在池中,以便使用相同 System.Transactions 事務對該連接池的下一次請求將返回相同的連接。如果該事務沒有可用連接,在該連接打開時,將自動注冊該連接。

            當連接關閉時,它將被釋放回池中,并根據其事務上下文放入相應的子部分。因此,即使分布式事務仍然掛起,仍可以關閉該連接而不會生成錯誤。這樣,您就可以在隨后提交或中止分布式事務。

            使用連接字符串關鍵字控制連接池

            SqlConnection 對象的 ConnectionString 屬性支持連接字符串鍵/值對,可以用于調整連接池邏輯的行為。有關更多信息,請參見 ConnectionString

            池碎片

            池碎片是許多 Web 應用程序中的一個常見問題,應用程序可能會創建大量在進程退出后才會釋放的池。這樣,將打開大量的連接,占用許多內存,從而影響性能。

            因為集成安全性產生的池碎片

            連接根據連接字符串以及用戶標識來建立池連接。因此,如果使用網站上的基本身份驗證或 Windows 身份驗證以及集成的安全登錄,每個用戶將獲得一個池。盡管這樣可以提高單個用戶的后續數據庫請求的性能,但是該用戶無法利用其他用戶建立的連接。這樣還使每個用戶至少產生一個與數據庫服務器的連接。這對特定 Web 應用程序結構會產生副作用,因為開發人員需要衡量安全性和審計要求。

            因為許多數據庫產生的池碎片

            許多 Internet 服務提供商在一臺服務器上托管多個網站。他們可能使用單個數據庫確認窗體身份驗證登錄,然后為該用戶或用戶組打開與特定數據庫的連接。與身份驗證數據庫的連接將建立池連接,供每個用戶使用。但是,每個數據庫的連接存在一個獨立的池,因此增加了與服務器的連接數。

            這也會對應用程序設計產生副作用。但是,可以通過一個相對簡單的方式避免此副作用,而又不會影響連接 SQL Server 時的安全性。不是為每個用戶或組連接獨立的數據庫,而是連接到服務器上的相同數據庫,然后執行 Transact-SQL USE 語句來切換為所需的數據庫。以下代碼段演示入如何創建與 master 數據庫的初始連接,然后切換到 databaseName 字符串變量中指定的所需數據庫。

            C#:
            // Assumes that command is a SqlCommand object.
            using (SqlConnection connection = new SqlConnection(
              "Server=MSSQL1;uid=xxx;pwd=xxx;database=master"))
              {
                connection.Open();
                command.ExecuteNonQuery("USE " + databaseName);
              }

            應用程序角色和連接池

            通過調用 sp_setapprole 系統存儲過程激活了 SQL Server 應用程序角色之后,該連接的安全上下文無法重置。但是,如果啟用了池,連接將返回池,在重復使用池連接時會出錯。

            如果使用的是 SQL Server 應用程序角色,我們建議您在連接字符串中為應用程序禁用連接池。有關更多信息,請參見知識庫文章“SQL application role errors with OLE DB resource pooling”。

            综合网日日天干夜夜久久| 国产精品99久久久精品无码| 久久人爽人人爽人人片AV| 亚洲婷婷国产精品电影人久久| 国产精品99久久精品| 精品久久久久久久| 国产成人久久AV免费| 97精品久久天干天天天按摩| 欧美熟妇另类久久久久久不卡 | 亚洲国产精品综合久久网络 | 欧美亚洲另类久久综合婷婷| 久久夜色精品国产亚洲| 国产精品成人精品久久久| 777久久精品一区二区三区无码| 日本道色综合久久影院| 久久久久国产亚洲AV麻豆| 中文成人无码精品久久久不卡| 亚洲国产成人久久综合野外| 久久伊人五月丁香狠狠色| 色欲综合久久中文字幕网| 久久国产精品-久久精品| 国产精品热久久无码av| 色综合久久天天综线观看| 亚洲精品无码久久久久去q| 狠狠干狠狠久久| 亚洲乱码日产精品a级毛片久久| 亚洲AV无码一区东京热久久| av国内精品久久久久影院| 久久国产精品免费| 久久天天躁夜夜躁狠狠躁2022 | 69SEX久久精品国产麻豆| 久久综合狠狠综合久久激情 | 久久久精品久久久久久| 国产成人无码精品久久久性色| 久久久91精品国产一区二区三区| 久久青青草原精品国产不卡| 久久久久国产精品熟女影院| 久久一区二区三区99| 久久免费国产精品一区二区| 国产精品中文久久久久久久| 久久精品中文字幕久久|