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

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

    • 分享

      詳解數(shù)據(jù)庫連接池概念、原理、運行機制等

       blackhappy 2019-06-18

      概述

      數(shù)據(jù)庫連接池是負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個。那么其中的運行機制又是怎樣的呢?今天主要介紹一下數(shù)據(jù)庫連接池原理和常用的連接池。


      01

      為什么要使用連接池

      數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。 一個數(shù)據(jù)庫連接對象均對應(yīng)一個物理數(shù)據(jù)庫連接,每次操作都打開一個物理連接,使用完都關(guān)閉連接,這樣造成系統(tǒng)的性能低下。

      數(shù)據(jù)庫連接池的解決方案是在應(yīng)用程序啟動時建立足夠的數(shù)據(jù)庫連接,并講這些連接組成一個連接池(簡單說:在一個“池”里放了好多半成品的數(shù)據(jù)庫連接對象),由應(yīng)用程序動態(tài)地對池中的連接進行申請、使用和釋放。對于多于連接池中連接數(shù)的并發(fā)請求,應(yīng)該在請求隊列中排隊等待。并且應(yīng)用程序可以根據(jù)池中連接的使用率,動態(tài)增加或減少池中的連接數(shù)。

      連接池技術(shù)盡可能多地重用了消耗內(nèi)存地資源,大大節(jié)省了內(nèi)存,提高了服務(wù)器地服務(wù)效率,能夠支持更多的客戶服務(wù)。通過使用連接池,將大大提高程序運行效率,同時,我們可以通過其自身的管理機制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。


      02

      傳統(tǒng)的連接機制與數(shù)據(jù)庫連接池運行機制區(qū)別

      1、不使用連接池流程

      下面以訪問MySQL為例,執(zhí)行一個SQL命令,如果不使用連接池,需要經(jīng)過哪些流程。

      不使用數(shù)據(jù)庫連接池的步驟:

      1. TCP建立連接的三次握手
      2. MySQL認(rèn)證的三次握手
      3. 真正的SQL執(zhí)行
      4. MySQL的關(guān)閉
      5. TCP的四次握手關(guān)閉

      可以看到,為了執(zhí)行一條SQL,卻多了非常多網(wǎng)絡(luò)交互。

      優(yōu)點:

      • 實現(xiàn)簡單

      缺點:

      • 網(wǎng)絡(luò)IO較多
      • 數(shù)據(jù)庫的負(fù)載較高
      • 響應(yīng)時間較長及QPS較低
      • 應(yīng)用頻繁的創(chuàng)建連接和關(guān)閉連接,導(dǎo)致臨時對象較多,GC頻繁
      • 在關(guān)閉連接后,會出現(xiàn)大量TIME_WAIT 的TCP狀態(tài)(在2個MSL之后關(guān)閉)

      2、使用連接池流程

      使用數(shù)據(jù)庫連接池的步驟:

      第一次訪問的時候,需要建立連接。 但是之后的訪問,均會復(fù)用之前創(chuàng)建的連接,直接執(zhí)行SQL語句。

      優(yōu)點:

      • 較少了網(wǎng)絡(luò)開銷
      • 系統(tǒng)的性能會有一個實質(zhì)的提升
      • 沒了麻煩的TIME_WAIT狀態(tài)

      03

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

      連接池的工作原理主要由三部分組成,分別為

      • 連接池的建立
      • 連接池中連接的使用管理
      • 連接池的關(guān)閉

      第一、連接池的建立。

      一般在系統(tǒng)初始化時,連接池會根據(jù)系統(tǒng)配置建立,并在池中創(chuàng)建了幾個連接對象,以便使用時能從連接池中獲取。連接池中的連接不能隨意創(chuàng)建和關(guān)閉,這樣避免了連接隨意建立和關(guān)閉造成的系統(tǒng)開銷。

      Java中提供了很多容器類可以方便的構(gòu)建連接池,例如Vector、Stack等。

      第二、連接池的管理。

      連接池管理策略是連接池機制的核心,連接池內(nèi)連接的分配和釋放對系統(tǒng)的性能有很大的影響。其管理策略是:

      當(dāng)客戶請求數(shù)據(jù)庫連接時,首先查看連接池中是否有空閑連接,如果存在空閑連接,則將連接分配給客戶使用;如果沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是否已經(jīng)達到最大連接數(shù),如果沒達到就重新創(chuàng)建一個連接給請求的客戶;如果達到就按設(shè)定的最大等待時間進行等待,如果超出最大等待時間,則拋出異常給客戶。

      當(dāng)客戶釋放數(shù)據(jù)庫連接時,先判斷該連接的引用次數(shù)是否超過了規(guī)定值,如果超過就從連接池中刪除該連接,否則保留為其他客戶服務(wù)。

      該策略保證了數(shù)據(jù)庫連接的有效復(fù)用,避免頻繁的建立、釋放連接所帶來的系統(tǒng)資源開銷。

      第三、連接池的關(guān)閉。

      當(dāng)應(yīng)用程序退出時,關(guān)閉連接池中所有的連接,釋放連接池相關(guān)的資源,該過程正好與創(chuàng)建相反。


      04

      連接池需要注意的點

      1、并發(fā)問題

      為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。

      這個問題相對比較好解決,因為各個語言自身提供了對并發(fā)管理的支持像java,c#等等,使用synchronized(java)lock(C#)關(guān)鍵字即可確保線程是同步的。

      2、事務(wù)處理

      我們知道,事務(wù)具有原子性,此時要求對數(shù)據(jù)庫的操作符合“ALL-OR-NOTHING”原則,即對于一組SQL語句要么全做,要么全不做。

      我們知道當(dāng)2個線程共用一個連接Connection對象,而且各自都有自己的事務(wù)要處理時候,對于連接池是一個很頭疼的問題,因為即使Connection類提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個數(shù)據(jù)庫操作是對應(yīng)那個事務(wù)的,這是由于我們有2個線程都在進行事務(wù)操作而引起的。

      為此我們可以使用每一個事務(wù)獨占一個連接來實現(xiàn),雖然這種方法有點浪費連接池資源但是可以大大降低事務(wù)管理的復(fù)雜性。

      3、連接池的分配與釋放

      連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時還可以加快用戶的訪問速度。

      對于連接的管理可使用一個List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶請求一個連接時,系統(tǒng)檢查這個List中有沒有可以分配的連接。如果有就把那個最合適的連接分配給他,如果沒有就拋出一個異常給用戶。

      4、連接池的配置與維護

      連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?

      系統(tǒng)可采取設(shè)置最小連接數(shù)(minConnection)和最大連接數(shù)(maxConnection)等參數(shù)來控制連接池中的連接。比方說,最小連接數(shù)是系統(tǒng)啟動時連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應(yīng)起來卻慢。這樣,可以在開發(fā)時,設(shè)置較小的最小連接數(shù),開發(fā)起來會快,而在系統(tǒng)實際使用時設(shè)置較大的,因為這樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問量,可通過軟件需求上得到。

      如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時間就對連接池進行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補充相應(yīng)數(shù)量的新連接,以保證連接池的正常運轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時再去檢查。


      總結(jié)

      時至今日,雖然每個應(yīng)用(需要RDBMS的)都離不開連接池,但在實際使用的時候,連接池已經(jīng)可以做到“隱形”了。也就是說在通常情況下,連接池完成項目初始化配置之后,就再不需要再做任何改動了。

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多