最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 連接池的設(shè)置與使用

 更新時(shí)間:2021年01月30日 10:20:43   作者:曠野風(fēng)箏少年  
這篇文章主要介紹了c# 連接池的設(shè)置與使用,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下

原由:許多用戶可能在查詢相同的數(shù)據(jù)庫(kù)以獲取相同的數(shù)據(jù)。在這些情況下,可以通過(guò)使應(yīng)用程序共享到數(shù)據(jù)源的連接來(lái)提高應(yīng)用程序的性能。否則,讓每個(gè)用戶打開(kāi)和關(guān)閉單獨(dú)的連接的開(kāi)銷(xiāo)會(huì)對(duì)應(yīng)用程序性能產(chǎn)生不利影響。這樣就有了連接池。

實(shí)現(xiàn):

C#在連接字符串中設(shè)置連接池

    如果使用的是 OleDbConnection、OdbcConnection 或 OracleConnection 類(lèi),則連接池將由提供程序自動(dòng)處理,所以您不必自己進(jìn)行管理。

    如果使用的是 SqlConnection 類(lèi),則連接池被隱式管理,但也提供選項(xiàng)允許您自己管理池。

    連接使用Open()方法打開(kāi)連接,這時(shí)候連接池就會(huì)初始化并建立設(shè)定的最小連接數(shù)。在使用完連接時(shí)一定要關(guān)閉連接,以便連接可以返回池。要關(guān)閉連接使用Close()

    當(dāng)連接數(shù)滿了并且申請(qǐng)連接的時(shí)間超過(guò)設(shè)置連接等待的時(shí)間時(shí),使用“異步進(jìn)程”,對(duì)數(shù)據(jù)庫(kù)進(jìn)行異步操作,確保連接能夠及時(shí)調(diào)用Close方法關(guān)閉連接,這樣能大大減少正在使用的連接數(shù)。

當(dāng)數(shù)據(jù)庫(kù)操作和訪問(wèn)頻繁的時(shí)候,減少創(chuàng)建連接和打開(kāi)連接所耗的時(shí)間,提升數(shù)據(jù)庫(kù)服務(wù)器的性能。 這里將詳細(xì)分析C#數(shù)據(jù)庫(kù)連接池。

使用C#數(shù)據(jù)庫(kù)連接池

連接到數(shù)據(jù)庫(kù)服務(wù)器通常由幾個(gè)需要軟長(zhǎng)時(shí)間的步驟組成。必須建立物理通道(例如套接字或命名管道),必須與服務(wù)器進(jìn)行初次連接,必須分析連接字符串信息,必須由服務(wù)器對(duì)連接進(jìn)行身份驗(yàn)證,等等。

實(shí)際上,大部份的應(yīng)用程序都是使用一個(gè)或幾個(gè)不同的連接配置。當(dāng)應(yīng)用程序的數(shù)據(jù)量和訪問(wèn)量大的時(shí)候,這意味著在運(yùn)行應(yīng)用程序的過(guò)程中,許多相同的連接將反 復(fù)地被打開(kāi)和關(guān)閉,從而會(huì)引起數(shù)據(jù)庫(kù)服務(wù)器效率低下甚至引發(fā)程序崩潰。為了確保應(yīng)用程序的穩(wěn)定和降低性能成本,我們可以在ADO.NET中使用稱為連接池的優(yōu)化方法來(lái)管理維護(hù)連接。

C#數(shù)據(jù)庫(kù)連接池可以減少創(chuàng)建連接的次數(shù)。定義最小連接數(shù)(固定連接數(shù)),當(dāng)用戶在連接上調(diào)用Open,連接池就會(huì)檢查池中是否有可用的連接。如果發(fā)現(xiàn)有連接可用,會(huì)將該連接返回給調(diào)用者,而不是創(chuàng)建新連接。應(yīng)用程序在該連接上調(diào)用Close時(shí),連接池會(huì)判斷該連接是否在最小連接數(shù)之內(nèi),如果“是”會(huì)將連接回收到活動(dòng)連接池中而不是真正關(guān)閉連接,否則將燒毀連接。連接返回到池中之后,即可在下一個(gè)Open調(diào)用中重復(fù)使用。

創(chuàng)建C#數(shù)據(jù)庫(kù)連接池

以下示例使用C#連接SQL數(shù)據(jù)庫(kù):

 class DbConn
    {
        //using System.Data;
        //using System.Data.SqlClient;
        private const int MaxPool = 10;         //最大連接數(shù)
        private const int MinPool = 5;          //最小連接數(shù)
        private const bool Asyn_Process = true; //設(shè)置異步訪問(wèn)數(shù)據(jù)庫(kù)
        private const bool Mars = true;         //在單個(gè)連接上得到和管理多個(gè)、僅向前引用和只讀的結(jié)果集(ADO.NET2.0) 
        private const int Conn_Timeout = 15;    //設(shè)置連接等待時(shí)間
        private const int Conn_Lifetime = 15;   //設(shè)置連接的生命周期
        private string ConnString = "";         //連接字符串      
        private SqlConnection SqlDrConn = null;  //連接對(duì)象

        public DbConn()//構(gòu)造函數(shù)
        {
            ConnString = GetConnString();
            SqlDrConn = new SqlConnection(ConnString);
        }

        private string GetConnString()
        {
            return "server=localhost;"
                + "integrated security=sspi;"
                + "database=pubs;"
                + "Max Pool Size=" + MaxPool + ";"
                + "Min Pool Size=" + MinPool + ";"
                + "Connect Timeout=" + Conn_Timeout + ";"
                + "Connection Lifetime=" + Conn_Lifetime + ";"
                +"Asynchronous Processing=" + Asyn_Process + ";";
                //+ "MultipleActiveResultSets=" + Mars + ";";
        }
       
        public DataTable GetDataReader(string StrSql)//數(shù)據(jù)查詢
        {                    
            //當(dāng)連接處于打開(kāi)狀態(tài)時(shí)關(guān)閉,然后再打開(kāi),避免有時(shí)候數(shù)據(jù)不能及時(shí)更新
            if (SqlDrConn.State == ConnectionState.Open)
            {
                SqlDrConn.Close();                
            }
            try
            {
                SqlDrConn.Open();
                SqlCommand SqlCmd = new SqlCommand(StrSql, SqlDrConn);
                SqlDataReader SqlDr = SqlCmd.ExecuteReader();
                if (SqlDr.HasRows)
                {
                    DataTable dt = new DataTable();
                    //讀取SqlDataReader里的內(nèi)容
                    dt.Load(SqlDr);
                    //關(guān)閉對(duì)象和連接
                    SqlDr.Close();
                    SqlDrConn.Close();                    
                    return dt;
                }
                return null;
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);          
                return null;
            }
            finally
            {        
                SqlDrConn.Close();
            }
        }
    }

通過(guò)調(diào)用SqlDrConn.Open()方法打開(kāi)連接,這時(shí)候連接池就會(huì)初始化并建立設(shè)定的最小連接數(shù)。想更清楚了解到連接池的 狀況可以通過(guò)SQL的查詢分析器執(zhí)行存儲(chǔ)過(guò)程sp_Who,它會(huì)列出當(dāng)前的數(shù)據(jù)庫(kù)進(jìn)程,查看loginname、dbname可以區(qū)分用戶的連接信息,但 要注意的是登錄查詢分析器本身會(huì)使用兩個(gè)連接,所以最好用另一個(gè)用戶名登錄查詢分析器。使用此方法還有一個(gè)麻煩地方就是要經(jīng)常按“執(zhí)行查詢”以更新進(jìn)程信 息。還有另一種方法個(gè)人認(rèn)為較好的,通過(guò)控制面板→管理工具→性能,右擊添加計(jì)算器,性能對(duì)象選擇 SQlServer:GeneralStatistics(常規(guī)統(tǒng)計(jì))然后計(jì)算器選擇UserConnections(用戶連接)最后按“添加”就可以實(shí) 時(shí)查看當(dāng)前連接數(shù)。

到了這里,連接池已經(jīng)實(shí)現(xiàn)了,但問(wèn)題往往會(huì)出現(xiàn)在運(yùn)行過(guò)程中。如連接池的連接數(shù)滿 了該怎樣處理?在這里我們應(yīng)該合理設(shè)置連接字符串中的ConnectTimeout屬性和ConnectionLifetime屬性(上面有解釋?zhuān)┭娱L(zhǎng)等 待時(shí)間,盡可能地在每次使用完連接之后調(diào)用Close方法關(guān)閉連接。但從中也有沒(méi)法避免的,當(dāng)連接數(shù)滿了并且申請(qǐng)連接的時(shí)間超過(guò)設(shè)置連接等待的時(shí)間時(shí),程 序?qū)?huì)引發(fā)InvalidOperationExceptio異常,我們可以通過(guò)捕獲此異常向用戶界面提示“系統(tǒng)正忙,請(qǐng)稍后再連接……”之類(lèi)的信息來(lái)緩 解這種情況。此外,也有另一種方法來(lái)解決這種情況,就是利用ADO.NET2.0新特性“異步進(jìn)程”,對(duì)數(shù)據(jù)庫(kù)進(jìn)行異步操作,確保連接能夠及時(shí)調(diào)用 Close方法關(guān)閉連接,這樣能大大減少正在使用的連接數(shù)。

使用方法:在連接字符串中加上AsynchronousProcessing=true表示使用異步處理操作。

當(dāng)應(yīng)用程序不再需要用到連接池的時(shí)候可以使用ClearPool或ClearAllPools方法清空連接池也可作重置連接池使用,方法如下:

SqlConnection.ClearPool(SqlConnectionconnection)清空關(guān)聯(lián)的連接池

SqlConnection.ClearAllPools()清空所有連接池

調(diào)用上述方法,如果連接正在使用,連接池會(huì)做相應(yīng)標(biāo)記,等連接關(guān)閉時(shí)自動(dòng)燒毀。

小結(jié)C#數(shù)據(jù)庫(kù)連接池

優(yōu)點(diǎn):當(dāng)數(shù)據(jù)庫(kù)操作和訪問(wèn)頻繁的時(shí)候,減少創(chuàng)建連接和打開(kāi)連接所耗的時(shí)間,提升數(shù)據(jù)庫(kù)服務(wù)器的性能。

缺點(diǎn):數(shù)據(jù)庫(kù)連接池中可能存在著多個(gè)沒(méi)有被使用的連接一直連接著數(shù)據(jù)庫(kù),這意味著資源的浪費(fèi)。

以上就是c# 連接池的設(shè)置與使用的詳細(xì)內(nèi)容,更多關(guān)于c# 連接池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中比較常用的DateTime結(jié)構(gòu)的使用方法

    C#中比較常用的DateTime結(jié)構(gòu)的使用方法

    這篇文章主要介紹了C#中比較常用的DateTime結(jié)構(gòu)的使用方法,需要的朋友可以參考下
    2015-11-11
  • C# Websocket連接實(shí)現(xiàn)wss協(xié)議

    C# Websocket連接實(shí)現(xiàn)wss協(xié)議

    本文主要介紹了C# Websocket連接實(shí)現(xiàn)wss協(xié)議,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • js事件模型與自定義事件實(shí)例解析

    js事件模型與自定義事件實(shí)例解析

    JavaScript一個(gè)最簡(jiǎn)單的事件模型,需要有事件綁定與觸發(fā),還有事件刪除。本文將對(duì)其具體實(shí)現(xiàn)代碼進(jìn)行解析,需要的朋友一起來(lái)看下吧
    2016-12-12
  • WPF如何自定義ProgressBar滾動(dòng)條樣式

    WPF如何自定義ProgressBar滾動(dòng)條樣式

    這篇文章主要給大家介紹了關(guān)于WPF如何自定義ProgressBar滾動(dòng)條樣式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WPF具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 基于C#開(kāi)發(fā)中的那些編碼問(wèn)題(詳談)

    基于C#開(kāi)發(fā)中的那些編碼問(wèn)題(詳談)

    下面小編就為大家分享一篇基于C#開(kāi)發(fā)中的那些編碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • C#中自定義事件和委托實(shí)例

    C#中自定義事件和委托實(shí)例

    這篇文章主要介紹了C#中自定義事件和委托實(shí)例的,本文先是闡述了事件的原理,然后講解了事件和委托的步驟,并給出了實(shí)例代碼,需要的朋友可以參考下
    2015-01-01
  • 詳解c# 強(qiáng)制轉(zhuǎn)換和類(lèi)型轉(zhuǎn)換

    詳解c# 強(qiáng)制轉(zhuǎn)換和類(lèi)型轉(zhuǎn)換

    這篇文章主要介紹了c# 強(qiáng)制轉(zhuǎn)換和類(lèi)型轉(zhuǎn)換的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-10-10
  • C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路分享

    C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路分享

    下面小編就為大家分享一篇C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • C# 總結(jié)QueueUserWorkItem傳參幾種方式案例詳解

    C# 總結(jié)QueueUserWorkItem傳參幾種方式案例詳解

    這篇文章主要介紹了C# 總結(jié)QueueUserWorkItem傳參幾種方式案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C#中的is和as操作符區(qū)別小結(jié)

    C#中的is和as操作符區(qū)別小結(jié)

    這篇文章主要介紹了C#中的is和as操作符區(qū)別小結(jié),is是驗(yàn)證操作對(duì)象是不是自己希望的,as是將對(duì)象轉(zhuǎn)換成指定類(lèi)型,需要的朋友可以參考下
    2015-01-01

最新評(píng)論

明水县| 沁阳市| 广汉市| 河北区| 莒南县| 青冈县| 阳春市| 西青区| 琼结县| 高阳县| 黄梅县| 安陆市| 南充市| 大同市| 万盛区| 南安市| 商南县| 鹿泉市| 仁布县| 桓台县| 西充县| 融水| 花莲县| 中江县| 万山特区| 乌拉特中旗| 全南县| 循化| 灵寿县| 庆阳市| 崇明县| 贵州省| 柯坪县| 庐江县| 古交市| 综艺| 错那县| 玉屏| 潼南县| 清苑县| 仲巴县|