問題一:什么是數(shù)據(jù)庫連接池,有什么作用? 數(shù)據(jù)庫連接是一種有限的昂貴的資源,
創(chuàng)新互聯(lián)公司擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)深耕十多年,專業(yè)且經(jīng)驗豐富。十多年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為超過千家中小企業(yè)提供了成都網(wǎng)站建設、網(wǎng)站制作解決方案,按需網(wǎng)站建設,設計滿意,售后服務無憂。所有客戶皆提供一年免費網(wǎng)站維護!
數(shù)據(jù)庫連接影響到程序的性能指標。
數(shù)據(jù)庫連接池正是針對這個問題提出來的。數(shù)據(jù)庫連接池負責分配、
管理和釋放數(shù)據(jù)庫連接,
它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,
而再不是重新建立一個;
釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)
據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。
這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
問題二:什么是數(shù)據(jù)庫連接池?謝謝了 數(shù)據(jù)庫連接池,簡稱dbcp databa績e connection pool
存在意義:
數(shù)據(jù)庫的連接是非常耗費系統(tǒng)資源的,一個應用通常都是需要與數(shù)據(jù)庫打交道,也就需要經(jīng)常連接數(shù)據(jù)庫,這樣導致浪費大量系統(tǒng)資源;
連接池的原理就是:我事先創(chuàng)建好幾個數(shù)據(jù)庫連接放著,當我的系統(tǒng)需要操作數(shù)據(jù)庫時就從連接池里直接拿連接,并將這個連接標記為 忙 ;用完后在放會池中,標記為 空閑;;;
當連接池里的連接都在被使用,如果此時還要連接,連接池就會在創(chuàng)建連接放到池里,,這些連接的數(shù)量,都是在配置文件里由你控制的
問題三:數(shù)據(jù)庫連接池是什么意思? 像打開關(guān)閉數(shù)據(jù)庫連接這種和數(shù)據(jù)庫的交互可能是很費時的,尤其是當客戶端數(shù)量增加的時候,會消耗大量的資源,成本是非常高的。可以在應用服務器啟動的時候建立很多個數(shù)據(jù)庫連接并維護在一個池中。連接請求由池中的連接提供。在連接使用完畢以后,把連接歸還到池中,以用于滿足將來更多的請求。
問題四:數(shù)據(jù)庫連接池的工作機制是什么? 為什么要使用數(shù)據(jù)庫連接池?
答:
由于創(chuàng)建連接的代價是很高的, 我們每次訪問數(shù)據(jù)庫都重新創(chuàng)建連接的話是非常消耗性的.
我們可以再程序啟動的時候先創(chuàng)建出一些連接, 放在一個 *** 中, 訪問數(shù)據(jù)庫的時候從 *** 中獲取, 使用結(jié)束再放回 *** 中.
這樣做只是在程序啟動的時候消耗性能去創(chuàng)建連接, 每次訪問數(shù)據(jù)庫的時候都是從內(nèi)存中獲取連接, 可以大大提升效率.
注意事項:
由于池中增刪非常頻繁, 使用 *** LinkedList效率較高
*** 中所有連接都被占用時創(chuàng)建新連接, 但需要注意連接總數(shù)
使用組合模式/動態(tài)代理處理釋放連接的方法, 當運行close方法時, 將連接放回池中
關(guān)于數(shù)據(jù)庫連接池:
數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點在多用戶的網(wǎng)頁應用程序中體現(xiàn)得尤為突出。對數(shù)據(jù)庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數(shù)據(jù)庫連接池正是針對這個問題提出來的。
數(shù)據(jù)庫連接池負責分配、管理和釋放數(shù)據(jù)庫連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設定的。無論這些數(shù)據(jù)庫連接是否被 使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當應用程序向連接池請求的連接數(shù)超 過最大連接數(shù)量時,這些請求將被加入到等待隊列中。
數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設置要考慮到下列幾個因素:
1) 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫連接,所以如果應用程序?qū)?shù)據(jù)庫連接的使用量不大,將會有大量的數(shù)據(jù)庫連接資源被浪費;
2) 最大連接數(shù)是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過此數(shù),后面的數(shù)據(jù)庫連接請求將被加入到等待隊列中,這會影響之后的數(shù)據(jù)庫操作。
3) 如果最小連接數(shù)與最大連接數(shù)相差太大,那么最先的連接請求將會獲利,之后超過最小連接數(shù)量的連接請求等價于建立一個新的數(shù)據(jù)庫連接。不過,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時后被釋放。
J2EE服務器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接。
調(diào)用:客戶端程序需要連接時,池驅(qū)動程序會返回一個未使用的池連接并將其表記為 忙。如果當前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。
釋放:當使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑, 其他調(diào)用就可以使用這個連接
問題五:數(shù)據(jù)庫連接池的作用是什么? 連接池是被j2ee服務器打開和維護的 對應1、2、4的JDBC驅(qū)動程序 連接池一般比直接連接更有優(yōu)越性 因為它提高了性能的同時還保存了 寶貴的資源。 打開數(shù)據(jù)庫連接時CPU和網(wǎng)絡的重要 任務,因此,在整個應用程序的使用過程 當中重復的打開直接連接將導致性能的下降。 而池連接只在服務器啟動時打開一次,從而 消除了這種性能問題。 另外,因為連接只用于很短的時間, 所以,連接可以被有效共享, 而且有關(guān)連接參數(shù)的特有信息, 只對池驅(qū)動程序有效, 如數(shù)據(jù)庫用戶名稱和密碼, 從而增強了系統(tǒng)的安全性和可管理性。
問題六:數(shù)據(jù)庫連接池的工作機制是什么 連接池的實現(xiàn)是以空間換時間。
J2EE服務器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接。客戶端程序需要連接時,池驅(qū)動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個連接。
問題七:數(shù)據(jù)庫連接池的作用是什么? 連接池是被j2ee服務器打開和維護的
對應1、2、4的JDBC驅(qū)動程序
連接池一般比直接連接更有優(yōu)越性
因為它提高了性能的同時還保存了
寶貴的資源。
打開數(shù)據(jù)庫連接時CPU和網(wǎng)絡的重要
任務,因此,在整個應用程序的使用過程
當中重復的打開直接連接將導致性能的下降。
而池連接只在服務器啟動時打開一次,從而
消除了這種性能問題。
另外,因為連接只用于很短的時間,
所以,連接可以被有效共享,
而且有關(guān)連接參數(shù)的特有信息,
只對池驅(qū)動程序有效,
如數(shù)據(jù)庫用戶名稱和密碼,
從而增強了系統(tǒng)的安全性和可管理性。
問題八:開源的數(shù)據(jù)庫連接池和普通的數(shù)據(jù)庫連接池有什么區(qū)別 在項目中嘗試使用了幾種開源的數(shù)據(jù)庫連接池實現(xiàn)。一種是dbcp,一種是c3p0,還有一種是proxool,這幾種數(shù)據(jù)庫連接池都可以很容易的在Spring配置起來。性能總體上上感覺dbcp為最優(yōu),因為穩(wěn)定性和并發(fā)性都是我的項目需要的。
項目中經(jīng)過反復測試,如果web server和數(shù)據(jù)庫server不是同一個機器的話,在斷網(wǎng)時間比較短的時間內(nèi)三種數(shù)據(jù)庫連接池都能較好的重連,但是在斷網(wǎng)時間超過8個鐘頭 proxool就不能恢復工作了。但是dbcp卻能很快的重新連接。實際生產(chǎn)環(huán)境中穩(wěn)定性和總體性能是最重要的,都需要做相應的測試才能放心的讓系統(tǒng)上生產(chǎn)線。
這里給出項目中數(shù)據(jù)庫連接池配置:
dbcp的jndi:13 4 java:p/env/jdbc/mysql5 6 proxool(proxool-0.9.0RC1)的配置: .mysql.jdbc.Driver jdbc:mysql:ip:3306/dbname?useUnicode=truecharacterEncoding=utf8autoReconnect=true user password 500 15000 select CURRENT_DATE true mysqlProxoolDataSource 1000 false 建議使用DBCP,配置在tomcat中,然后在spring中使用jndi的形式獲取。 c3p0(c3p0-0.9.0): 1 3 4 .mysql.jdbc.Driver 5 6 7 jdbc:mysql:192.168.0.225:3306/sendinmdb?useUnicode=truecharacterEncoding=utf8autoReconnect=true 8 9 10 ********11 12 13 ********14 15 16 10017 18 19 5020 21 22 10023 24 25 100026 27 28 3029 30 直接copy paste到spring配置文件里就可以使用了。 配置一些額外的tomcat 的DBCP連接池參數(shù),也可以更好的使用到類似proxool提供的功能,只是dbcp更加穩(wěn)定而已。tomcat/conf/context.xml中插入一個Resource元素: 解釋一下以下這些參數(shù)的含義:
validationQuery = select current_date()
testOnBorrow = true
testOnReturn = false
testWhileIdle = true
當 從池中獲取一個Connection后使用 select current_date() 來測試該數(shù)據(jù)庫連接的可用性,如果SQL語句返回結(jié)果則認為是一個有效的連接,否則將繼續(xù)測試知道可以拿到有效的連接。當返回Connection給池的時候不進行驗證,但是Connection空閑的時候就要進行認證。
timeBetweenEvictionRunsMillis = 15000
DBCP 清空線程睡眠的間隙,如值為負數(shù)則不運行該線程
numTestsPerEvictionRun = 10"......
問題九:sqlite 使用什么數(shù)據(jù)庫連接池 數(shù)據(jù)庫連接是一種有限的昂貴的資源,
數(shù)據(jù)庫連接影響到程序的性能指標。
數(shù)據(jù)庫連接池正是針對這個問題提出來的。數(shù)據(jù)庫連接池負責分配、
管理和釋放數(shù)據(jù)庫連接,
它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,
而再不是重新建立一個;
釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)
據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。
這項技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
問題十:說出數(shù)據(jù)連接池的工作機制是什么? 以典型的數(shù)據(jù)庫連接池為例:首先普通的數(shù)據(jù)庫訪問是這樣的:程序和數(shù)據(jù)庫建立連接,發(fā)送數(shù)據(jù)操作的指令,完成后斷開連接。等下一次請求的時候重復這個過程,即每個請求都需要和數(shù)據(jù)庫建立連接和斷開連接,這樣當數(shù)據(jù)量大的時候系統(tǒng)的消耗是很大的。連接池就是為了解決這個問題:在一個空間中預先建立好一定數(shù)量的連接,當程序請求數(shù)據(jù)時直接使用池中的現(xiàn)存的連接,不需要重復建立連接和斷開的過程,節(jié)省了時間提高了性能
數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。如:
外部使用者可通過getConnection 方法獲取連接,使用完畢后再通過releaseConnection 方法將連接返回,注意此時連接并沒有關(guān)閉,而是由連接池管理器回收,并為下一次使用做好準備。
這次我們采取技術(shù)演進的方式來談談數(shù)據(jù)庫連接池的技術(shù)出現(xiàn)過程及其原理,以及當下最流行的開源數(shù)據(jù)庫連接池jar包。
1、原理
一般來說,Java應用程序訪問數(shù)據(jù)庫的過程是 :
①裝載數(shù)據(jù)庫驅(qū)動程序;
②通過jdbc建立數(shù)據(jù)庫連接;
③訪問數(shù)據(jù)庫,執(zhí)行sql語句;
④斷開數(shù)據(jù)庫連接。
2、代碼
3、分析
程序開發(fā)過程中,存在很多問題:首先,每一次web請求都要建立一次數(shù)據(jù)庫連接。建立連接是一個費時的活動,每次都得花費0.05s~1s的時間,而且系統(tǒng)還要分配內(nèi)存資源。這個時間對于一次或幾次數(shù)據(jù)庫操作,或許感覺不出系統(tǒng)有多大的開銷??墒菍τ诂F(xiàn)在的web應用,尤其是大型電子商務網(wǎng)站,同時有幾百人甚至幾千人在線是很正常的事。在這種情況下,頻繁的進行數(shù)據(jù)庫連接操作勢必占用很多的系統(tǒng)資源,網(wǎng)站的響應速度必定下降,嚴重的甚至會造成服務器的崩潰。不是危言聳聽,這就是制約某些電子商務網(wǎng)站發(fā)展的技術(shù)瓶頸問題。其次,對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會導致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將不得不重啟數(shù)據(jù)庫。還有,這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導致內(nèi)存泄漏,服務器崩潰。
上述的用戶查詢案例,如果同時有1000人訪問,就會不斷的有數(shù)據(jù)庫連接、斷開操作:
通過上面的分析,我們可以看出來,“數(shù)據(jù)庫連接”是一種稀缺的資源,為了保障網(wǎng)站的正常使用,應該對其進行妥善管理。其實我們查詢完數(shù)據(jù)庫后,如果不關(guān)閉連接,而是暫時存放起來,當別人使用時,把這個連接給他們使用。就避免了一次建立數(shù)據(jù)庫連接和斷開的操作時間消耗。原理如下:
由上面的分析可以看出,問題的根源就在于對數(shù)據(jù)庫連接資源的低效管理。我們知道,對于共享資源,有一個很著名的設計模式:資源池(resource pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決上述問題,可以采用數(shù)據(jù)庫連接池技術(shù)。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數(shù)量的連接,當需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量﹑使用情況,為系統(tǒng)開發(fā)﹑測試及性能調(diào)整提供依據(jù)。
我們自己嘗試開發(fā)一個連接池,來為上面的查詢業(yè)務提供數(shù)據(jù)庫連接服務:
① 編寫class 實現(xiàn)DataSource 接口
② 在class構(gòu)造器一次性創(chuàng)建10個連接,將連接保存LinkedList中
③ 實現(xiàn)getConnection 從 LinkedList中返回一個連接
④ 提供將連接放回連接池中方法
1、連接池代碼
2、使用連接池重構(gòu)我們的用戶查詢函數(shù)
這就是數(shù)據(jù)庫連接池的原理,它大大提供了數(shù)據(jù)庫連接的利用率,減小了內(nèi)存吞吐的開銷。我們在開發(fā)過程中,就不需要再關(guān)心數(shù)據(jù)庫連接的問題,自然有數(shù)據(jù)庫連接池幫助我們處理,這回放心了吧。但連接池需要考慮的問題不僅僅如此,下面我們就看看還有哪些問題需要考慮。
1、并發(fā)問題
為了使連接管理服務具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個問題相對比較好解決,因為java語言自身提供了對并發(fā)管理的支持,使用synchronized關(guān)鍵字即可確保線程是同步的。使用方法為直接在類方法前面加上synchronized關(guān)鍵字,如:
2、多數(shù)據(jù)庫服務器和多用戶
對于大型的企業(yè)級應用,常常需要同時連接不同的數(shù)據(jù)庫(如連接oracle和sybase)。如何連接不同的數(shù)據(jù)庫呢?我們采用的策略是:設計一個符合單例模式的連接池管理類,在連接池管理類的唯一實例被創(chuàng)建時讀取一個資源文件,其中資源文件中存放著多個數(shù)據(jù)庫的url地址等信息。根據(jù)資源文件提供的信息,創(chuàng)建多個連接池類的實例,每一個實例都是一個特定數(shù)據(jù)庫的連接池。連接池管理類實例為每個連接池實例取一個名字,通過不同的名字來管理不同的連接池。
對于同一個數(shù)據(jù)庫有多個用戶使用不同的名稱和密碼訪問的情況,也可以通過資源文件處理,即在資源文件中設置多個具有相同url地址,但具有不同用戶名和密碼的數(shù)據(jù)庫連接信息。
3、事務處理
我們知道,事務具有原子性,此時要求對數(shù)據(jù)庫的操作符合“all-all-nothing”原則即對于一組sql語句要么全做,要么全不做。
在java語言中,connection類本身提供了對事務的支持,可以通過設置connection的autocommit屬性為false 然后顯式的調(diào)用commit或rollback方法來實現(xiàn)。但要高效的進行connection復用,就必須提供相應的事務支持機制??刹捎妹恳粋€事務獨占一個連接來實現(xiàn),這種方法可以大大降低事務管理的復雜性。
4、連接池的分配與釋放
連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復用度,從而降低建立新連接的開銷,同時還可以加快用戶的訪問速度。
對于連接的管理可使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時間存放到一個空閑池中。每當用戶請求一個連接時,系統(tǒng)首先檢查空閑池內(nèi)有沒有空閑連接。如果有就把建立時間最長(通過容器的順序存放實現(xiàn))的那個連接分配給他(實際是先做連接是否有效的判斷,如果可用就分配給用戶,如不可用就把這個連接從空閑池刪掉,重新檢測空閑池是否還有連接);如果沒有則檢查當前所開連接池是否達到連接池所允許的最大連接數(shù)(maxconn)如果沒有達到,就新建一個連接,如果已經(jīng)達到,就等待一定的時間(timeout)。如果在等待的時間內(nèi)有連接被釋放出來就可以把這個連接分配給等待的用戶,如果等待時間超過預定時間timeout 則返回空值(null)。系統(tǒng)對已經(jīng)分配出去正在使用的連接只做計數(shù),當使用完后再返還給空閑池。對于空閑連接的狀態(tài),可開辟專門的線程定時檢測,這樣會花費一定的系統(tǒng)開銷,但可以保證較快的響應速度。也可采取不開辟專門線程,只是在分配前檢測的方法。
5、連接池的配置與維護
連接池中到底應該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設置最小連接數(shù)(minconn)和最大連接數(shù)(maxconn)來控制連接池中的連接。最小連接數(shù)是系統(tǒng)啟動時連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的響應速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應起來卻慢。這樣,可以在開發(fā)時,設置較小的最小連接數(shù),開發(fā)起來會快,而在系統(tǒng)實際使用時設置較大的,因為這樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設置多少,要看系統(tǒng)的訪問量,可通過反復測試,找到最佳點。
如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時間就對連接池進行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補充相應數(shù)量的新連接以保證連接池的正常運轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時再去檢查。
理解了連接池的原理就可以了,沒有必要什么都從頭寫一遍,那樣會花費很多時間,并且性能及穩(wěn)定性也不一定滿足要求。事實上,已經(jīng)存在很多流行的性能優(yōu)良的第三方數(shù)據(jù)庫連接池jar包供我們使用。如:
其中c3p0已經(jīng)很久沒有更新了。DBCP更新速度很慢,基本處于不活躍狀態(tài),而Druid和HikariCP處于活躍狀態(tài)的更新中。
連接池運作原理在實際應用開發(fā)中,特別是在WEB應用系統(tǒng)中,如果JSP、Servlet或EJB使用JDBC直接訪問數(shù)據(jù)庫中的數(shù)據(jù),每一次數(shù)據(jù)訪問請求都必須經(jīng)歷建立數(shù)據(jù)庫連接、打開數(shù)據(jù)庫、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫連接等步驟,而連接并打開數(shù)據(jù)庫是一件既消耗資源又費時的工作,如果頻繁發(fā)生這種數(shù)據(jù)庫操作,系統(tǒng)的性能必然會急劇下降,甚至會導致系統(tǒng)崩潰。數(shù)據(jù)庫連接池技術(shù)是解決這個問題最常用的方法,在許多應用程序服務器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了這項技術(shù),無需自己編程,但是,深入了解這項技術(shù)是非常必要的。數(shù)據(jù)庫連接池技術(shù)的思想非常簡單,將數(shù)據(jù)庫連接作為對象存儲在一個Vector對象中,一旦數(shù)據(jù)庫連接建立后,不同的數(shù)據(jù)庫訪問請求就可以共享這些連接,這樣,通過復用這些已經(jīng)建立的數(shù)據(jù)庫連接,可以克服上述缺點,極大地節(jié)省系統(tǒng)資源和時間。數(shù)據(jù)庫連接池的主要操作如下:(1)建立數(shù)據(jù)庫連接池對象(服務器啟動)。(2)按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的數(shù)據(jù)庫連接(即:空閑連接數(shù))。(3)對于一個數(shù)據(jù)庫訪問請求,直接從連接池中得到一個連接。如果數(shù)據(jù)庫連接池對象中沒有空閑的連接,且連接數(shù)沒有達到最大(即:最大活躍連接數(shù)),創(chuàng)建一個新的數(shù)據(jù)庫連接。(4)存取數(shù)據(jù)庫。(5)關(guān)閉數(shù)據(jù)庫,釋放所有數(shù)據(jù)庫連接(此時的關(guān)閉數(shù)據(jù)庫連接,并非真正關(guān)閉,而是將其放入空閑隊列中。如實際空閑連接數(shù)大于初始空閑連接數(shù)則釋放連接)。(6)釋放數(shù)據(jù)庫連接池對象(服務器停止、維護期間,釋放數(shù)據(jù)庫連接池對象,并釋放所有連接)。連接池的實現(xiàn)1、連接池模型 本文討論的連接池包括一個連接池類(DBConnectionPool)和一個連接池管理類(DBConnetionPoolManager)。連接池類是對某一數(shù)據(jù)庫所有連接的“緩沖池”,主要實現(xiàn)以下功能:①從連接池獲取或創(chuàng)建可用連接;②使用完畢之后,把連接返還給連接池;③在系統(tǒng)關(guān)閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源;④還能夠處理無效連接(原來登記為可用的連接,由于某種原因不再可用,如超時,通訊問題),并能夠限制連接池中的連接總數(shù)不低于某個預定值和不超過某個預定值。 連接池管理類是連接池類的外覆類(wrapper),符合單例模式,即系統(tǒng)中只能有一個連接池管理類的實例。其主要用于對多個連接池對象的管理,具有以下功能:①裝載并注冊特定數(shù)據(jù)庫的JDBC驅(qū)動程序;②根據(jù)屬性文件給定的信息,創(chuàng)建連接池對象;③為方便管理多個連接池對象,為每一個連接池對象取一個名字,實現(xiàn)連接池名字與其實例之間的映射;④跟蹤客戶使用連接情況,以便需要是關(guān)閉連接釋放資源。連接池管理類的引入主要是為了方便對多個連接池的使用和管理,如系統(tǒng)需要連接不同的數(shù)據(jù)庫,或連接相同的數(shù)據(jù)庫但由于安全性問題,需要不同的用戶使用不同的名稱和密碼。 2、連接池實現(xiàn) 下面給出連接池類和連接池管理類的主要屬性及所要實現(xiàn)的基本接口: public class DBConnectionPool implements TimerListener{ private int checkedOut;//已被分配出去的連接數(shù) private ArrayList freeConnections = new ArrayList();//容器,空閑池,根據(jù)//創(chuàng)建時間順序存放已創(chuàng)建但尚未分配出去的連接 private int minConn;//連接池里連接的最小數(shù)量 private int maxConn;//連接池里允許存在的最大連接數(shù) private String name;//為這個連接池取個名字,方便管理 private String password;//連接數(shù)據(jù)庫時需要的密碼 private String url;//所要創(chuàng)建連接的數(shù)據(jù)庫的地址 private String user;//連接數(shù)據(jù)庫時需要的用戶名 public Timer timer;//定時器 public DBConnectionPool(String name, String URL, String user, String password, int maxConn)//公開的構(gòu)造函數(shù) public synchronized void freeConnection(Connection con) //使用完畢之后,//把連接返還給空閑池 public synchronized Connection getConnection(long timeout)//得到一個連接,//timeout是等待時間 public synchronized void release()//斷開所有連接,釋放占用的系統(tǒng)資源 private Connection newConnection()//新建一個數(shù)據(jù)庫連接 public synchronized void TimerEvent() //定時器事件處理函數(shù) } public class DBConnectionManager { static private DBConnectionManager instance;//連接池管理類的唯一實例 static private int clients;//客戶數(shù)量 private ArrayList drivers = new ArrayList();//容器,存放數(shù)據(jù)庫驅(qū)動程序 private HashMap pools = new HashMap ();//以name/value的形式存取連接池//對象的名字及連接池對象 static synchronized public DBConnectionManager getInstance()//如果唯一的//實例instance已經(jīng)創(chuàng)建,直接返回這個實例;否則,調(diào)用私有構(gòu)造函數(shù),創(chuàng)//建連接池管理類的唯一實例 private DBConnectionManager()//私有構(gòu)造函數(shù),在其中調(diào)用初始化函數(shù)init() public void freeConnection(String name, Connection con)// 釋放一個連接,//name是一個連接池對象的名字 public Connection getConnection(String name)//從名字為name的連接池對象//中得到一個連接 public Connection getConnection(String name, long time)//從名字為name //的連接池對象中取得一個連接,time是等待時間 public synchronized void release()//釋放所有資源 private void createPools(Properties props)//根據(jù)屬性文件提供的信息,創(chuàng)建//一個或多個連接池 private void init()//初始化連接池管理類的唯一實例,由私有構(gòu)造函數(shù)調(diào)用 private void loadDrivers(Properties props)//裝載數(shù)據(jù)庫驅(qū)動程序 } 3、連接池使用 上面所實現(xiàn)的連接池在程序開發(fā)時如何應用到系統(tǒng)中呢?下面以Servlet為例說明連接池的使用。 Servlet的生命周期是:在開始建立servlet時,調(diào)用其初始化(init)方法。之后每個用戶請求都導致一個調(diào)用前面建立的實例的service方法的線程。最后,當服務器決定卸載一個servlet時,它首先調(diào)用該servlet的 destroy方法。 根據(jù)servlet的特點,我們可以在初始化函數(shù)中生成連接池管理類的唯一實例(其中包括創(chuàng)建一個或多個連接池)。如: public void init() throws ServletException { connMgr = DBConnectionManager.getInstance(); } 然后就可以在service方法中通過連接池名稱使用連接池,執(zhí)行數(shù)據(jù)庫操作。最后在destroy方法中釋放占用的系統(tǒng)資源,如: public void destroy() { connMgr.release(); super.destroy(); } 結(jié)束語在使用JDBC進行與數(shù)據(jù)庫有關(guān)的應用開發(fā)中,數(shù)據(jù)庫連接的管理是一個難點。很多時候,連接的混亂管理所造成的系統(tǒng)資源開銷過大成為制約大型企業(yè)級應用效率的瓶頸。對于眾多用戶訪問的Web應用,采用數(shù)據(jù)庫連接技術(shù)的系統(tǒng)在效率和穩(wěn)定性上比采用傳統(tǒng)的其他方式的系統(tǒng)要好很多。本文闡述了使用JDBC訪問數(shù)據(jù)庫的技術(shù)?討論了基于連接池技術(shù)的數(shù)據(jù)庫連接管理的關(guān)鍵問題并給出了一個實現(xiàn)模型。文章所給出的是連接池管理程序的一種基本模式,為提高系統(tǒng)的整體性能,在此基礎上還可以進行很多有意義的擴展。
現(xiàn)在使用PDO鏈接數(shù)據(jù)庫的較多
連接是通過創(chuàng)建 PDO 基類的實例而建立的。不管使用哪種驅(qū)動程序,都是用 PDO 類名。構(gòu)造函數(shù)接收用于指定數(shù)據(jù)庫源(所謂的 DSN)以及可能還包括用戶名和密碼(如果有的話)的參數(shù)。
連接到 MySQL
?php
$dbh?=?new?PDO('mysql:host=localhost;dbname=test',?$user,?$pass);
?
如果有任何連接錯誤,將拋出一個 PDOException 異常對象。如果想處理錯誤狀態(tài),可以捕獲異常,或者選擇留給通過 set_exception_handler() 設置的應用程序全局異常處理程序。
處理連接錯誤
?php
try?{
$dbh?=?new?PDO('mysql:host=localhost;dbname=test',?$user,?$pass);
foreach($dbh-query('SELECT?*?from?FOO')?as?$row)?{
print_r($row);
}
$dbh?=?null;
}?catch?(PDOException?$e)?{
print?"Error!:?"?.?$e-getMessage()?.?"br/";
die();
}
?
如果應用程序不在 PDO 構(gòu)造函數(shù)中捕獲異常,zend 引擎采取的默認動作是結(jié)束腳本并顯示一個回溯跟蹤,此回溯跟蹤可能泄漏完整的數(shù)據(jù)庫連接細節(jié),包括用戶名和密碼。因此有責任去顯式(通過 catch 語句)或隱式(通過 set_exception_handler() )地捕獲異常。
連接數(shù)據(jù)成功后,返回一個 PDO 類的實例給腳本,此連接在 PDO 對象的生存周期中保持活動。要想關(guān)閉連接,需要銷毀對象以確保所有剩余到它的引用都被刪除,可以賦一個 NULL 值給對象變量。如果不明確地這么做,PHP 在腳本結(jié)束時會自動關(guān)閉連接。
關(guān)閉一個連接
?php
$dbh?=?new?PDO('mysql:host=localhost;dbname=test',?$user,?$pass);
//?在此使用連接
//?現(xiàn)在運行完成,在此關(guān)閉連接
$dbh?=?null;
?
很多 web 應用程序通過使用到數(shù)據(jù)庫服務的持久連接獲得好處。持久連接在腳本結(jié)束后不會被關(guān)閉,且被緩存,當另一個使用相同憑證的腳本連接請求時被重用。持久連接緩存可以避免每次腳本需要與數(shù)據(jù)庫回話時建立一個新連接的開銷,從而讓 web 應用程序更快。
本文題目:php數(shù)據(jù)庫連接池原理 數(shù)據(jù)庫連接池原理及實現(xiàn)
文章網(wǎng)址:http://jinyejixie.com/article0/dochoio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號、面包屑導航、建站公司、Google、做網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)