乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      實(shí)現(xiàn)高效的數(shù)據(jù)庫(kù)連接池(附帶完整代碼C#和Java實(shí)現(xiàn)),數(shù)據(jù)庫(kù)相關(guān)文章,Access,數(shù)...

       WindySky 2009-12-31
      據(jù)庫(kù)應(yīng)用程序程序員
      系統(tǒng)分析員
      模塊設(shè)計(jì)師
      有一定功底的程序員
      目錄
      引言
      數(shù)據(jù)庫(kù)連接池(Connection Pool)的工作原理
      連接池關(guān)鍵問(wèn)題分析
      并發(fā)問(wèn)題
      事務(wù)處理
      連接池的分配與釋放
      連接池的配置與維護(hù)
      關(guān)鍵議題
      引用記數(shù)
      如何實(shí)現(xiàn)事務(wù)處理

       管理連接池

      結(jié)合代碼說(shuō)明
      構(gòu)造方法
      啟動(dòng)服務(wù)StartService
      停止服務(wù)StopService
      申請(qǐng) GetConnectionFormPool
      釋放DisposeConnection
      如何更新屬性
      如何確定連接是否失效
      使用線程管理連接池
      threadCreate
      threadCheck
       其他

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

       連接池關(guān)鍵問(wèn)題分析
        1、并發(fā)問(wèn)題
        為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問(wèn)題。這個(gè)問(wèn)題相對(duì)比較好解決,因?yàn)楦鱾€(gè)語(yǔ)言自身提供了對(duì)并發(fā)管理的支持像java,c#等等,使用synchronized(java)lock(C#)關(guān)鍵字即可確保線程是同步的。使用方法可以參考,相關(guān)文獻(xiàn)。
       ?。?、事務(wù)處理
        我們知道,事務(wù)具有原子性,此時(shí)要求對(duì)數(shù)據(jù)庫(kù)的操作符合“ALL-ALL-NOTHING”原則,即對(duì)于一組SQL語(yǔ)句要么全做,要么全不做。
        我們知道當(dāng)2個(gè)線程公用一個(gè)連接Connection對(duì)象,而且各自都有自己的事務(wù)要處理時(shí)候,對(duì)于連接池是一個(gè)很頭疼的問(wèn)題,因?yàn)榧词笴onnection類提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個(gè)數(shù)據(jù)庫(kù)操作是對(duì)應(yīng)那個(gè)事務(wù)的,這是由于我們有2個(gè)線程都在進(jìn)行事務(wù)操作而引起的。為此我們可以使用每一個(gè)事務(wù)獨(dú)占一個(gè)連接來(lái)實(shí)現(xiàn),雖然這種方法有點(diǎn)浪費(fèi)連接池資源但是可以大大降低事務(wù)管理的復(fù)雜性。
       ?。?、連接池的分配與釋放
        連接池的分配與釋放,對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開(kāi)銷,同時(shí)還可以加快用戶的訪問(wèn)速度。
        對(duì)于連接的管理可使用一個(gè)List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶請(qǐng)求一個(gè)連接時(shí),系統(tǒng)檢查這個(gè)List中有沒(méi)有可以分配的連接。如果有就把那個(gè)最合適的連接分配給他(如何能找到最合適的連接文章將在關(guān)鍵議題中指出);如果沒(méi)有就拋出一個(gè)異常給用戶,List中連接是否可以被分配由一個(gè)線程來(lái)專門(mén)管理捎后我會(huì)介紹這個(gè)線程的具體實(shí)現(xiàn)。
        ?。础⑦B接池的配置與維護(hù)
        連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConnection)和最大連接數(shù)(maxConnection)等參數(shù)來(lái)控制連接池中的連接。比方說(shuō),最小連接數(shù)是系統(tǒng)啟動(dòng)時(shí)連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過(guò)多,則系統(tǒng)啟動(dòng)就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會(huì)很快;如果創(chuàng)建過(guò)少,則系統(tǒng)啟動(dòng)的很快,響應(yīng)起來(lái)卻慢。這樣,可以在開(kāi)發(fā)時(shí),設(shè)置較小的最小連接數(shù),開(kāi)發(fā)起來(lái)會(huì)快,而在系統(tǒng)實(shí)際使用時(shí)設(shè)置較大的,因?yàn)檫@樣對(duì)訪問(wèn)客戶來(lái)說(shuō)速度會(huì)快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問(wèn)量,可通過(guò)軟件需求上得到。
        如何確保連接池中的最小連接數(shù)呢?有動(dòng)態(tài)和靜態(tài)兩種策略。動(dòng)態(tài)即每隔一定時(shí)間就對(duì)連接池進(jìn)行檢測(cè),如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補(bǔ)充相應(yīng)數(shù)量的新連接,以保證連接池的正常運(yùn)轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時(shí)再去檢查。
      關(guān)鍵議題

      引用記數(shù)
        在分配、釋放策略對(duì)于有效復(fù)用連接非常重要,我們采用的方法也是采用了一個(gè)很有名的設(shè)計(jì)模式:Reference Counting(引用記數(shù))。該模式在復(fù)用資源方面用的非常廣泛,我們把該方法運(yùn)用到對(duì)于連接的分配釋放上。每一個(gè)數(shù)據(jù)庫(kù)連接,保留一個(gè)引用記數(shù),用來(lái)記錄該連接的使用者的個(gè)數(shù)。具體的實(shí)現(xiàn)上,我們對(duì)Connection類進(jìn)行進(jìn)一步包裝來(lái)實(shí)現(xiàn)引用記數(shù)。被包裝的Connection類我們提供2個(gè)方法來(lái)實(shí)現(xiàn)引用記數(shù)的操作,一個(gè)是Repeat(被分配出去)Remove(被釋放回來(lái));然后利用RepeatNow屬性來(lái)確定當(dāng)前被引用多少,具體是哪個(gè)用戶引用了該連接將在連接池中登記;最后提供IsRepeat屬性來(lái)確定該連接是否可以使用引用記數(shù)技術(shù)。一旦一個(gè)連接被分配出去,那么就會(huì)對(duì)該連接的申請(qǐng)者進(jìn)行登記,并且增加引用記數(shù),當(dāng)被釋放回來(lái)時(shí)候就刪除他已經(jīng)登記的信息,同時(shí)減少一次引用記數(shù)。
        這樣做有一個(gè)很大的好處,使得我們可以高效的使用連接,因?yàn)橐坏┧羞B接都被分配出去,我們就可以根據(jù)相應(yīng)的策略從使用池中挑選出一個(gè)已經(jīng)正在使用的連接用來(lái)復(fù)用,而不是隨意拿出一個(gè)連接去復(fù)用。策略可以根據(jù)需要去選擇,我們有4策略可是使用:
      1.ConnLevel_ReadOnly 獨(dú)占方式
        使用空閑的實(shí)際連接分配連接資源,并且在該資源釋放回之前,該資源在連接池中將不能將其引用分配給其他申請(qǐng)者。如果連接池中所有實(shí)際連接資源都已經(jīng)分配出去,那么即使連接池可以在分配引用資源在該模式下連接遲將不會(huì)分配連接資源,連接池會(huì)產(chǎn)生一個(gè)異常,標(biāo)志連接池資源耗盡。
        例:假如一個(gè)實(shí)際連接可以被分配5次,那么使用該模式申請(qǐng)連接的話您將損失4個(gè)可分配的連接,只將得到一個(gè)連接資源。 直至該資源被釋放回連接池,連接池才繼續(xù)分配它剩余的4次機(jī)會(huì)。
        當(dāng)你在使用連接時(shí)可能應(yīng)用到事務(wù)時(shí),可以使用該模式的連接,以確定在事務(wù)進(jìn)行期間您可以對(duì)該連接具有獨(dú)享權(quán)限,以避免各個(gè)數(shù)據(jù)庫(kù)操作訪問(wèn)的干擾。
      2.ConnLevel_High 優(yōu)先級(jí)-高
        使用空閑的實(shí)際連接分配連接資源,并且在該資源釋放回之前,該資源在連接池中將可能將其引用分配給其他申請(qǐng)者。*注意:此級(jí)別不保證在分配該資源后,仍然保持獨(dú)立占有連接資源,若想獨(dú)立占有資源請(qǐng)使用ReadOnely, 因?yàn)楫?dāng)連接池達(dá)到某一時(shí)機(jī)時(shí)該資源將被重復(fù)分配(引用記數(shù))然而這個(gè)時(shí)機(jī)是不可預(yù)測(cè)的。如果您申請(qǐng)的連接會(huì)用于事務(wù)處理您可以使用ConnLevel_ReadOnly級(jí)別。
      3.ConnLevel_None 優(yōu)先級(jí)-中
        適當(dāng)應(yīng)用引用記數(shù)技術(shù)分配連接資源。
      在該模式下,連接池內(nèi)部會(huì)按照實(shí)際連接已經(jīng)使用次數(shù)排序(多->少),然后在結(jié)果中選取 1/3 位置的連接資源返回。與優(yōu)先級(jí)-高相同該模式也不具備保持獨(dú)立占有連接資源的特性。如果您申請(qǐng)的連接會(huì)用于事務(wù)處理您可以使用ConnLevel_ReadOnly級(jí)別。
      4.ConnLevel_Bottom 優(yōu)先級(jí)-底
      盡可能使用引用記數(shù)技術(shù)分配連接。在該模式下,連接池內(nèi)部會(huì)按照實(shí)際連接已經(jīng)使用次數(shù)排序(多->少),然后在結(jié)果中選取被使用最多的返回。該模式適合處理較為不重要的連接資源請(qǐng)求。與優(yōu)先級(jí)-高相同該模式也不具備保持獨(dú)立占有連接資源的特性。如果您申請(qǐng)的連接會(huì)用于事務(wù)處理您可以使用ConnLevel_ReadOnly級(jí)別。
      以上4條策略選自datebasepool_SDK(datebasepool是本文所開(kāi)發(fā)的最終產(chǎn)物)

      如何實(shí)現(xiàn)事務(wù)處理
         前面談到的都是關(guān)于使用數(shù)據(jù)庫(kù)連接進(jìn)行普通的數(shù)據(jù)庫(kù)訪問(wèn)。對(duì)于事務(wù)處理,情況就變得比較復(fù)雜。因?yàn)槭聞?wù)本身要求原子性的保證,此時(shí)就要求對(duì)于數(shù)據(jù)庫(kù)的操作符合"All-All-Nothing"原則,即要么全部完成,要么什么都不做。如果簡(jiǎn)單的

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多