• <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>

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

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

            相關(guān)技術(shù):

            • 連接池
            • 引用記數(shù)
            • 多線程
            • Timer類運(yùn)行基理
            • C#.Net  

            適宜人群

            • 數(shù)據(jù)庫應(yīng)用程序程序員
            • 系統(tǒng)分析員
            • 模塊設(shè)計(jì)師
            • 有一定功底的程序員

            目錄

            • 引言
              1. 數(shù)據(jù)庫連接池(Connection Pool)的工作原理
            • 連接池關(guān)鍵問題分析
              1. 并發(fā)問題
              2. 事務(wù)處理
              3. 連接池的分配與釋放
              4. 連接池的配置與維護(hù)
            • 關(guān)鍵議題
              1. 引用記數(shù)
              2. 如何實(shí)現(xiàn)事務(wù)處理
              3.  管理連接池
            • 結(jié)合代碼說明
              1. 構(gòu)造方法
              2. 啟動服務(wù)StartService
              3. 停止服務(wù)StopService
              4. 申請 GetConnectionFormPool
              5. 釋放DisposeConnection
              6. 如何更新屬性
              7. 如何確定連接是否失效
              8. 使用線程管理連接池
                1. threadCreate
                2. threadCheck
              9.  其他


            引言

            一般的數(shù)據(jù)庫應(yīng)用程序大致都遵循下面的步驟:

            1. 初始化程序
            2. 用戶在UI上輸入操作
            3. 由用戶操作產(chǎn)生數(shù)據(jù)庫操作
            4. 將數(shù)據(jù)庫操作遞交到數(shù)據(jù)庫服務(wù)器
            5. .... (重復(fù)2~4)
            6. 關(guān)閉應(yīng)用程序

              而本文則著重講解上面第4步驟.在著一步驟中我們經(jīng)常是,打開數(shù)據(jù)庫連接操作數(shù)據(jù)庫,最后關(guān)閉數(shù)據(jù)庫.
              在服務(wù)器端程序設(shè)計(jì)上與數(shù)據(jù)庫的操作顯得十分重要,因?yàn)槟阋幚淼臄?shù)據(jù)操作十分巨大.如果頻繁創(chuàng)建數(shù)據(jù)庫連接頻繁關(guān)閉數(shù)據(jù)庫連接則會引起效率低下甚至引發(fā)程序崩潰.
              也許我們可以有另一種操作數(shù)據(jù)庫的形式,我們可以在程序運(yùn)行時(shí)打開一個(gè)數(shù)據(jù)庫連接,讓這個(gè)連接永久存在直到程序'死亡',那么這樣做也有不安全隱患,我們知道一個(gè)對象存在時(shí)間越長或被使用次數(shù)越多則它表現(xiàn)的越不穩(wěn)定,著不穩(wěn)定因素是由于對象內(nèi)部可能存在的潛在設(shè)計(jì)問題產(chǎn)生,對于數(shù)據(jù)庫連接對象道理也一樣.我們不能保證一個(gè)Connection對象里面能一點(diǎn)問題不存在.所以我們也不敢長時(shí)間將它長時(shí)間占用內(nèi)存.
              既然有這么多的問題由此我們需要一個(gè)能幫我們維護(hù)數(shù)據(jù)庫連接的東西-它就是連接池,網(wǎng)上有很多的連接池例子,但是多數(shù)都是簡單的例子,或者介紹比較復(fù)雜的連接池原理,沒有一個(gè)比較完整介紹和實(shí)現(xiàn)連接池的例子.這里就介紹你如何自己制作一個(gè)連接池.
              對于共享資源,有一個(gè)很著名的設(shè)計(jì)模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決我們的問題,可以采用數(shù)據(jù)庫連接池技術(shù)。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量﹑使用情況,為系統(tǒng)開發(fā)﹑測試及性能調(diào)整提供依據(jù)。連接池的基本工作原理見下圖。

            數(shù)據(jù)庫連接池(Connection Pool)的工作原理

             連接池關(guān)鍵問題分析

              1、并發(fā)問題

              為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個(gè)問題相對比較好解決,因?yàn)楦鱾€(gè)語言自身提供了對并發(fā)管理的支持像java,c#等等,使用synchronized(java)lock(C#)關(guān)鍵字即可確保線程是同步的。使用方法可以參考,相關(guān)文獻(xiàn)。

              2、事務(wù)處理

              我們知道,事務(wù)具有原子性,此時(shí)要求對數(shù)據(jù)庫的操作符合“ALL-ALL-NOTHING”原則,即對于一組SQL語句要么全做,要么全不做。
              我們知道當(dāng)2個(gè)線程公用一個(gè)連接Connection對象,而且各自都有自己的事務(wù)要處理時(shí)候,對于連接池是一個(gè)很頭疼的問題,因?yàn)榧词笴onnection類提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個(gè)數(shù)據(jù)庫操作是對應(yīng)那個(gè)事務(wù)的,這是由于我們有2個(gè)線程都在進(jìn)行事務(wù)操作而引起的。為此我們可以使用每一個(gè)事務(wù)獨(dú)占一個(gè)連接來實(shí)現(xiàn),雖然這種方法有點(diǎn)浪費(fèi)連接池資源但是可以大大降低事務(wù)管理的復(fù)雜性。

              3、連接池的分配與釋放

              連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時(shí)還可以加快用戶的訪問速度。
              對于連接的管理可使用一個(gè)List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶請求一個(gè)連接時(shí),系統(tǒng)檢查這個(gè)List中有沒有可以分配的連接。如果有就把那個(gè)最合適的連接分配給他(如何能找到最合適的連接文章將在關(guān)鍵議題中指出);如果沒有就拋出一個(gè)異常給用戶,List中連接是否可以被分配由一個(gè)線程來專門管理捎后我會介紹這個(gè)線程的具體實(shí)現(xiàn)。

               4、連接池的配置與維護(hù)

              連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConnection)和最大連接數(shù)(maxConnection)等參數(shù)來控制連接池中的連接。比方說,最小連接數(shù)是系統(tǒng)啟動時(shí)連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應(yīng)起來卻慢。這樣,可以在開發(fā)時(shí),設(shè)置較小的最小連接數(shù),開發(fā)起來會快,而在系統(tǒng)實(shí)際使用時(shí)設(shè)置較大的,因?yàn)檫@樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問量,可通過軟件需求上得到。
              如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時(shí)間就對連接池進(jìn)行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補(bǔ)充相應(yīng)數(shù)量的新連接,以保證連接池的正常運(yùn)轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時(shí)再去檢查。

            Feedback

            # re: [轉(zhuǎn)]編寫高效的數(shù)據(jù)庫連接池  回復(fù)  更多評論   

            2008-03-12 15:30 by ieyhli
            很不錯啊,我想看全文怎么辦啊?

            # re: [轉(zhuǎn)]編寫高效的數(shù)據(jù)庫連接池  回復(fù)  更多評論   

            2011-06-17 14:26 by tianliang
            不錯
            欧美亚洲国产精品久久久久| 精品少妇人妻av无码久久| 久久99久久成人免费播放| 久久久久亚洲精品男人的天堂| 思思久久精品在热线热| 国产情侣久久久久aⅴ免费| 久久久久无码中| 精品久久无码中文字幕| 婷婷久久综合| 国产精品美女久久久久| 日韩人妻无码一区二区三区久久99| 国内精品久久久久久99蜜桃| 久久久久无码专区亚洲av| 国产成人精品免费久久久久| 色综合久久天天综线观看| 久久天天躁狠狠躁夜夜avapp| 久久九色综合九色99伊人| 午夜精品久久久久久中宇| 久久久久久A亚洲欧洲AV冫 | 久久久精品久久久久久 | 97久久超碰国产精品旧版| 四虎国产精品成人免费久久| 狠狠狠色丁香婷婷综合久久五月 | 久久九九兔免费精品6| 日本久久久精品中文字幕| 久久婷婷五月综合国产尤物app| 日日狠狠久久偷偷色综合96蜜桃| 91精品国产综合久久久久久 | 成人a毛片久久免费播放| 久久久久国产精品熟女影院| 久久伊人五月丁香狠狠色| 亚洲午夜久久久| 亚洲国产成人久久一区WWW| 久久国产精品视频| 久久精品综合一区二区三区| Xx性欧美肥妇精品久久久久久| 久久国产精品99久久久久久老狼| 99久久99这里只有免费费精品| 1000部精品久久久久久久久| 久久精品水蜜桃av综合天堂| 国产成人久久精品一区二区三区|