數(shù)據(jù)庫連接池

目前常用的數(shù)據(jù)源主要有c3p0、dbcp伶丐、proxool悼做、druid
Spring 推薦使用dbcp;
Hibernate 推薦使用c3p0和proxool
1哗魂、 DBCP:apache
DBCP(DataBase connection pool)數(shù)據(jù)庫連接池肛走。是apache上的一個 java連接池項目,也是 tomcat使用的連接池組件录别。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數(shù)據(jù)庫連接是一個非常耗時耗資源的行為朽色,所以通過連接池預(yù)先同數(shù)據(jù)庫建立一些連接,放在內(nèi)存中组题,應(yīng)用程序需要建立數(shù)據(jù)庫連接時直接到連接池中申請一個就行葫男,用完后再放回去。dbcp沒有自動的去回收空閑連接的功能崔列。

2梢褐、 C3P0:
C3P0是一個開源的jdbc連接池,它實現(xiàn)了數(shù)據(jù)源和jndi綁定赵讯,支持jdbc3規(guī)范和jdbc2的標準擴展盈咳。c3p0是異步操作的,緩慢的jdbc操作通過幫助進程完成边翼。擴展這些操作可以有效的提升性能鱼响。目前使用它的開源項目有Hibernate,Spring等组底。c3p0有自動回收空閑連接功能热押。

3、 Proxool:Sourceforge
Proxool是一種Java數(shù)據(jù)庫連接池技術(shù)斤寇。是sourceforge下的一個開源項目,這個項目提供一個健壯桶癣、易用的連接池,最為關(guān)鍵的是這個連接池提供監(jiān)控的功能娘锁,方便易用牙寞,便于發(fā)現(xiàn)連接泄漏的情況。

綜合來說莫秆,穩(wěn)定性是dbcp>=c3p0>proxool

后來阿里巴巴的druid開源了间雀,可以是前無古人后無來者,最強沒有之一镊屎,十分穩(wěn)定惹挟,在大并發(fā)中表現(xiàn)十分好

基本原理

  • pool.getConnection(),都是先從threadlocal里面拿的缝驳,如果threadlocal里面有连锯,則用归苍,保證線程里的多個dao操作,用的是同一個connection运怖,以保證事務(wù)拼弃。
  • 如果新線程,則將新的connection放在threadlocal里摇展,再get給到線程吻氧。

重點代碼

private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); 
 // 獲得當前連接  
    public Connection getCurrentConnecton(){  
        // 默認線程里面取  
        Connection conn = threadLocal.get();  
        if(!isValid(conn)){  
            conn = getConnection();  
        }  
        return conn;  
    }  

// 獲得連接  
    public synchronized Connection getConnection() {  
        Connection conn = null;  
        try {  
            // 判斷是否超過最大連接數(shù)限制  
            if(contActive < this.dbBean.getMaxActiveConnections()){  
                if (freeConnection.size() > 0) {  
                    conn = freeConnection.get(0);  
                    if (conn != null) {  
                        threadLocal.set(conn);  
                    }  
                    freeConnection.remove(0);  
                } else {  
                    conn = newConnection();  
                }  
                  
            }else{  
                // 繼續(xù)獲得連接,直到從新獲得連接  
                wait(this.dbBean.getConnTimeOut());  
                conn = getConnection();  
            }  
            if (isValid(conn)) {  
                activeConnection.add(conn);  
                contActive ++;  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        return conn;  
    }
public synchronized void releaseConn(Connection conn) throws SQLException {  
        if (isValid(conn)&& !(freeConnection.size() > dbBean.getMaxConnections())) {  
            freeConnection.add(conn);  
            activeConnection.remove(conn);  
            contActive --;  
            threadLocal.remove();  
            // 喚醒所有正待等待的線程,去搶連接  
            notifyAll();  
        }  
    } 

重理解此段話

什么是線程池,什么是ThreadLocal???

  • 線程池,為避免不必要的創(chuàng)建,銷毀connection而存在的,其中包括活動,等待,最小等屬性,cop3,proxy連接池都可以配置這些玩意;
  • 為什么要用ThreadLocal呢?這個和連接池無關(guān),我認為更多的是和程序本身相關(guān),為了更清楚的說明,舉個例子
    servlet中獲取一個連接.首先,servlet是線程安全的嗎?
    class MyServlet extends HttpServlet{
    private Connection conn;
    }
    ok,遺憾的告訴你,這個conn并不是安全的,所有請求這個servlet的連接,使用的都是一個Connection,這個就是致命的了.多個人使用同一個連接,算上延遲啥的,天知道數(shù)據(jù)會成什么樣.
    因此我們要保證Connection對每個請求都是唯一的.這個時候就可以用到ThreadLocal了,保證每個線程都有自己的連接.
    改為 private ThreadLocal<Connection> ct = new ThreadLocal<Connnection>();
    然后從連接池獲取Connection,set到ct中,再get就行了,至于得到的是哪個Connection就是連接池的問題了,你也管不到咏连。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盯孙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祟滴,更是在濱河造成了極大的恐慌振惰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踱启,死亡現(xiàn)場離奇詭異报账,居然都是意外死亡研底,警方通過查閱死者的電腦和手機埠偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榜晦,“玉大人冠蒋,你說我怎么就攤上這事∏海” “怎么了抖剿?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長识窿。 經(jīng)常有香客問我斩郎,道長,這世上最難降的妖魔是什么喻频? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任缩宜,我火速辦了婚禮,結(jié)果婚禮上甥温,老公的妹妹穿的比我還像新娘锻煌。我一直安慰自己,他們只是感情好姻蚓,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布宋梧。 她就那樣靜靜地躺著,像睡著了一般狰挡。 火紅的嫁衣襯著肌膚如雪捂龄。 梳的紋絲不亂的頭發(fā)上释涛,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音跺讯,去河邊找鬼枢贿。 笑死,一個胖子當著我的面吹牛刀脏,可吹牛的內(nèi)容都是我干的局荚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愈污,長吁一口氣:“原來是場噩夢啊……” “哼耀态!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暂雹,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤首装,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杭跪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仙逻,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年涧尿,在試婚紗的時候發(fā)現(xiàn)自己被綠了系奉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姑廉,死狀恐怖缺亮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桥言,我是刑警寧澤萌踱,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站号阿,受9級特大地震影響并鸵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扔涧,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一园担、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扰柠,春花似錦粉铐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劝枣,卻和暖如春汤踏,著一層夾襖步出監(jiān)牢的瞬間织鲸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工溪胶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搂擦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓哗脖,卻偏偏與公主長得像瀑踢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子才避,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 數(shù)據(jù)庫連接池在Java數(shù)據(jù)庫相關(guān)中間件產(chǎn)品群中橱夭,應(yīng)該算是底層最基礎(chǔ)的一類產(chǎn)品,作為企業(yè)應(yīng)用開發(fā)必不可少的組件...
    許da廣閱讀 7,173評論 2 27
  • 最原始的數(shù)據(jù)庫連接就是我們打開一個連接桑逝,使用過后再關(guān)閉該鏈接來釋放資源棘劣。頻繁的新建打開再關(guān)閉連接對jvm和數(shù)據(jù)庫都...
    野柳閱讀 6,362評論 1 11
  • 聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權(quán)匿名楞遏,對文章有最終解釋權(quán)茬暇;凱哥學堂旨在促進VIP學員互...
    凱哥學堂閱讀 1,044評論 0 0
  • 現(xiàn)在常用的開源數(shù)據(jù)連接池主要有c3p0、dbcp和proxool三種寡喝,其中:hibernate開發(fā)組推薦使用c3p...
    呵呵飄過閱讀 1,399評論 0 3
  • 蟲草依鳴糙俗,荷花如畫。吾愛之妻拘荡,水邊描畫臼节。為年少輕狂撬陵,為自由飛翔珊皿。再美之人,終有一老巨税。惜汝依然如花似月蟋定,念吾永遠年少...
    云小兮閱讀 408評論 1 3