c3p0 服务启动获取连接超时_JDBC数据库连接池
連接池的本質(zhì)是構(gòu)建一個(gè)容器,容器是用來(lái)存創(chuàng)建好的線程,http連接、數(shù)據(jù)庫(kù)連接、netty連接等
各個(gè)連接池的使用大致分為三個(gè)部分
1、首先是初始化連接池,根據(jù)設(shè)置相應(yīng)的參數(shù)、連接池的大小、核心連接數(shù)等參數(shù),初始化創(chuàng)建數(shù)據(jù)庫(kù)、http連接、netty連接以及jdk線程等。
2、第二步是連接池的使用,直接從連接池中、線程中取出資源即可使用,使用完后交還給連接池、線程池,通過(guò)池容器對(duì)線程進(jìn)行管理。
3、對(duì)于連接池維護(hù),連接池、線程池來(lái)維護(hù)連接、線程狀態(tài),不可用連接、線程進(jìn)行銷(xiāo)毀,正在使用連接、線程進(jìn)行狀態(tài)標(biāo)注,連接、線程不夠后并且少于設(shè)置最大連接、線程數(shù),要進(jìn)行新連接、線程創(chuàng)建。
什么情況下使用連接池?
對(duì)于一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用,由于對(duì)于數(shù)據(jù)庫(kù)的訪問(wèn)不是很頻繁。這時(shí)可以簡(jiǎn)單地在需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),就新創(chuàng)建一個(gè)連接,用完后就關(guān)閉它,這樣做也不會(huì)帶來(lái)什么明顯的性能上的開(kāi)銷(xiāo)。但是對(duì)于一個(gè)復(fù)雜的數(shù)據(jù)庫(kù)應(yīng)用,情況就完全不同了。頻繁的建立、關(guān)閉連接,會(huì)極大的減低系統(tǒng)的性能,因?yàn)閷?duì)于連接的使用成了系統(tǒng)性能的瓶頸。
使用連接池的好處
連接復(fù)用。通過(guò)建立一個(gè)數(shù)據(jù)庫(kù)連接池以及一套連接使用管理策略,使得一個(gè)數(shù)據(jù)庫(kù)連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫(kù)連接頻繁建立、關(guān)閉的開(kāi)銷(xiāo)。
對(duì)于共享資源,有一個(gè)很著名的設(shè)計(jì)模式:資源池。該模式正是為了解決資源頻繁分配、釋放所造成的問(wèn)題的。把該模式應(yīng)用到數(shù)據(jù)庫(kù)連接管理領(lǐng)域,就是建立一個(gè)數(shù)據(jù)庫(kù)連接池,提供一套高效的連接分配、使用策略,最終目標(biāo)是實(shí)現(xiàn)連接的高效、安全的復(fù)用。
連接池的實(shí)現(xiàn)
數(shù)據(jù)庫(kù)連接池的基本原理是在內(nèi)部對(duì)象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫(kù)連接,并對(duì)外暴露數(shù)據(jù)庫(kù)連接獲取和返回方法。
外部使用者可通過(guò) getConnection 方法獲取連接,使用完畢后再通過(guò) close 方法將連接返回,注意此時(shí)連接并沒(méi)有關(guān)閉,而是由連接池管理器回收,并為下一次使用做好準(zhǔn)備。
Java 中有一個(gè) DataSource 接口, 數(shù)據(jù)庫(kù)連接池就是 DataSource 的一個(gè)實(shí)現(xiàn)
常用數(shù)據(jù)庫(kù)連接池
Apache DBCP官網(wǎng):http://commons.apache.org/proper/commons-dbcp/
C3P0官網(wǎng):https://www.mchange.com/projects/c3p0/index.html
DruidGitHub:https://github.com/alibaba/druid
一、JDBC數(shù)據(jù)庫(kù)連接池的必要性
在使用開(kāi)發(fā)基于數(shù)據(jù)庫(kù)的web程序時(shí),傳統(tǒng)的模式基本是按以下步驟:
①在主程序(如servlet、beans)中建立數(shù)據(jù)庫(kù)連接。
②進(jìn)行sql操作
③斷開(kāi)數(shù)據(jù)庫(kù)連接。
這種模式開(kāi)發(fā),存在的問(wèn)題:
二、數(shù)據(jù)庫(kù)連接池(connection pool)
數(shù)據(jù)庫(kù)連接池簡(jiǎn)單介紹
為解決傳統(tǒng)開(kāi)發(fā)中的數(shù)據(jù)庫(kù)連接問(wèn)題,可以采用數(shù)據(jù)庫(kù)連接池技術(shù)。
數(shù)據(jù)庫(kù)連接池的基本思想就是為數(shù)據(jù)庫(kù)連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。
數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重新建立一個(gè)。
數(shù)據(jù)庫(kù)連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接放到連接池中,這些數(shù)據(jù)庫(kù)連接的數(shù)量是由最小數(shù)據(jù)庫(kù)連接數(shù)來(lái)設(shè)定的。無(wú)論這些數(shù)據(jù)庫(kù)連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫(kù)連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過(guò)最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。
數(shù)據(jù)庫(kù)連接池工作原理:
數(shù)據(jù)庫(kù)連接池工作原理
數(shù)據(jù)庫(kù)連接池技術(shù)的優(yōu)點(diǎn)
資源重用:
①由于數(shù)據(jù)庫(kù)連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開(kāi)銷(xiāo)。在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增加了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性。
更快的系統(tǒng)反應(yīng)速度: 數(shù)據(jù)庫(kù)連接池在初始化過(guò)程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫(kù)連接置于連接池中備用。此時(shí)連接的初始化工作均已完成。對(duì)于業(yè)務(wù)請(qǐng)求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫(kù)連接初始化和釋放過(guò)程的時(shí)間開(kāi)銷(xiāo),從而減少了系統(tǒng)的響應(yīng)時(shí)間
新的資源分配手段: 對(duì)于多應(yīng)用共享同一數(shù)據(jù)庫(kù)的系統(tǒng)而言,可在應(yīng)用層通過(guò)數(shù)據(jù)庫(kù)連接池的配置,實(shí)現(xiàn)某一應(yīng)用最大可用數(shù)據(jù)庫(kù)連接數(shù)的限制,避免某一應(yīng)用獨(dú)占所有的數(shù)據(jù)庫(kù)資源
統(tǒng)一的連接管理,避免數(shù)據(jù)庫(kù)連接泄露: 在較為完善的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的占用超時(shí)設(shè)定,強(qiáng)制回收被占用連接,從而避免了常規(guī)數(shù)據(jù)庫(kù)連接操作中可能出現(xiàn)的資源泄露
三、兩種開(kāi)源的數(shù)據(jù)庫(kù)連接池
JDBC 的數(shù)據(jù)庫(kù)連接池使用 javax.sql.DataSource 來(lái)表示,DataSource 只是一個(gè)接口,該接口通常由服務(wù)器(Weblogic, WebSphere, Tomcat)提供實(shí)現(xiàn),也有一些開(kāi)源組織提供實(shí)現(xiàn): ①DBCP 數(shù)據(jù)庫(kù)連接池 ②C3P0 數(shù)據(jù)庫(kù)連接池
DataSource 通常被稱(chēng)為數(shù)據(jù)源,它包含連接池和連接池管理兩個(gè)部分,習(xí)慣上也經(jīng)常把 DataSource稱(chēng)為連接池
數(shù)據(jù)源和數(shù)據(jù)庫(kù)連接不同,數(shù)據(jù)源無(wú)需創(chuàng)建多個(gè),它是產(chǎn)生數(shù)據(jù)庫(kù)連接的工廠,因此整個(gè)應(yīng)用只需要一個(gè)數(shù)據(jù)源即可。
當(dāng)數(shù)據(jù)庫(kù)訪問(wèn)結(jié)束后,程序還是像以前一樣關(guān)閉數(shù)據(jù)庫(kù)連接:conn.close(); 但上面的代碼并沒(méi)有關(guān)閉數(shù)據(jù)庫(kù)的物理連接,它僅僅把數(shù)據(jù)庫(kù)連接釋放,歸還給了數(shù)據(jù)庫(kù)連接池。
總結(jié)
以上是生活随笔為你收集整理的c3p0 服务启动获取连接超时_JDBC数据库连接池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab窗函数 响应,matlab窗
- 下一篇: metinfo mysql 数据表_《M