一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

有效發(fā)揮數(shù)據(jù)庫的最大效率

 qzg589 2005-09-09

有效發(fā)揮數(shù)據(jù)庫的最大效率

[日期:2005-07-08] 來源:CSDN  作者: [字體: ]

有效發(fā)揮數(shù)據(jù)庫的最大效率

snapbug

Dec 2003 

1.     前言

數(shù)據(jù)庫應(yīng)用,在許多軟件系統(tǒng)中經(jīng)常用到,是開發(fā)中大型系統(tǒng)不可缺少的輔助。但如果對(duì)數(shù)據(jù)庫資源沒有很好地管理(如:沒有及時(shí)回收數(shù)據(jù)庫的游標(biāo)(ResultSet)Statement、連接 (Connection)等資源),往往會(huì)直接導(dǎo)致系統(tǒng)的穩(wěn)定。這類不穩(wěn)定因素,不單單由數(shù)據(jù)庫或者系統(tǒng)本身一方引起,只有系統(tǒng)正式使用后,隨著流量、用戶的增加,才會(huì)逐步顯露。

 

在基于Java開發(fā)的系統(tǒng)中,JDBC是程序員和數(shù)據(jù)庫打交道的主要途徑,提供了完備的數(shù)據(jù)庫操作方法接口。但考慮到規(guī)范的適用性,JDBC只提供了最直接的數(shù)據(jù)庫操作規(guī)范,對(duì)數(shù)據(jù)庫資源管理,如:對(duì)物理連接的管理及緩沖,期望第三方應(yīng)用服務(wù)器(Application Server)的提供。

 

本文,以JDBC規(guī)范為基礎(chǔ),介紹相關(guān)的數(shù)據(jù)庫連接池機(jī)制,并就如果以簡(jiǎn)單的方式,實(shí)現(xiàn)有效地管理數(shù)據(jù)庫資源介紹相關(guān)實(shí)現(xiàn)技術(shù)。

 

2.     連接池技術(shù)背景

2.1     JDBC

JDBC是一個(gè)規(guī)范,遵循JDBC接口規(guī)范,各個(gè)數(shù)據(jù)庫廠家各自實(shí)現(xiàn)自己的驅(qū)動(dòng)程序(Driver),如下圖所示:

 

應(yīng)用在獲取數(shù)據(jù)庫連接時(shí),需要以URL的方式指定是那種類型的Driver,在獲得特定的連接后,可按照固定的接口操作不同類型的數(shù)據(jù)庫,如: 分別獲取Statement、執(zhí)行SQL獲得ResultSet等,如下面的例子 :

import java.sql.*;

…..

 

 

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

Connection dbConn = DriverManager.getConnection(

“jdbc:oracle:thin:@127.0.0.1:1521:oracle”,

“username”, “password” );

 

Statement st = dbConn.createStatement();

ResultSet rs = st.executeQuery( “select * from demo_table” );

 

…some data source operation in here

 

rs.close();

st.close();

dbConn.close();

 

在完成數(shù)據(jù)操作后,還一定要關(guān)閉所有涉及到的數(shù)據(jù)庫資源。這雖然對(duì)應(yīng)用程序的邏輯沒有任何影響,但是關(guān)鍵的操作。上面是個(gè)簡(jiǎn)單的例子,如果攙和眾多的if-else、exception,資源的管理也難免百密一疏。如同C中的內(nèi)存泄漏問題,Java系統(tǒng)也同樣會(huì)面臨崩潰的惡運(yùn)。所以

 

數(shù)據(jù)庫資源的管理依賴于應(yīng)用系統(tǒng)本身,是不安全、不穩(wěn)定的一種隱患。

 

2.2     JDBC連接池

在標(biāo)準(zhǔn)JDBC對(duì)應(yīng)用的接口中,并沒有提供資源的管理方法。所以,缺省的資源管理由應(yīng)用自己負(fù)責(zé)。雖然在JDBC規(guī)范中,多次提及資源的關(guān)閉/回收及其他的合理運(yùn)用。但最穩(wěn)妥的方式,還是為應(yīng)用提供有效的管理手段。所以,JDBC為第三方應(yīng)用服務(wù)器(Application Server)提供了一個(gè)由數(shù)據(jù)庫廠家實(shí)現(xiàn)的管理標(biāo)準(zhǔn)接口:連接緩沖(connection pooling)。引入了連接池( Connection Pool )的概念 ,也就是以緩沖池的機(jī)制管理數(shù)據(jù)庫的資源。

 

JDBC最常用的資源有三類:

-          Connection: 數(shù)據(jù)庫連接。

-          Statement: 會(huì)話聲明。

-          ResultSet: 結(jié)果集游標(biāo)。

  分別存在以下的關(guān)系

這是一種 --的關(guān)系,對(duì)Connection的管理,就是對(duì)數(shù)據(jù)庫資源的管理。舉個(gè)例子: 如果想確定某個(gè)數(shù)據(jù)庫連接(Connection)是否超時(shí),則需要確定其(所有的)子Statement是否超時(shí),同樣,需要確定所有相關(guān)的ResultSet是否超時(shí);在關(guān)閉Connection前,需要關(guān)閉所有相關(guān)的StatementResultSet。

 

因此,連接池(Connection Pool)所起到的作用,不僅僅簡(jiǎn)單地管理Connection,還涉及到 StatementResultSet。

 

2.3     連接池(ConnectionPool)與資源管理

ConnectionPool以緩沖池的機(jī)制,在一定數(shù)量上限范圍內(nèi),控制管理ConnectionStatementResultSet。任何數(shù)據(jù)庫的資源是有限的,如果被耗盡,則無法獲得更多的數(shù)據(jù)服務(wù)。

 

在大多數(shù)情況下,資源的耗盡不是由于應(yīng)用的正常負(fù)載過高,而是程序原因。

 

在實(shí)際工作中,數(shù)據(jù)資源往往是瓶頸資源,不同的應(yīng)用都會(huì)訪問同一數(shù)據(jù)源。其中某個(gè)應(yīng)用耗盡了數(shù)據(jù)庫資源后,意味其他的應(yīng)用也無法正常運(yùn)行。因此,ConnectionPool的第一個(gè)任務(wù)是限制:每個(gè)應(yīng)用或系統(tǒng)可以擁有的最大資源。也就是確定連接池的大小(PoolSize)

 

ConnectionPool的第二個(gè)任務(wù):在連接池的大小(PoolSize)范圍內(nèi),最大限度地使用資源,縮短數(shù)據(jù)庫訪問的使用周期。許多數(shù)據(jù)庫中,連接(Connection)并不是資源的最小單元,控制Statement資源比Connection更重要。以Oracle為例:

每申請(qǐng)一個(gè)連接(Connection)會(huì)在物理網(wǎng)絡(luò)(如 TCP/IP網(wǎng)絡(luò))上建立一個(gè)用于通訊的連接,在此連接上還可以申請(qǐng)一定數(shù)量的Statement。同一連接可提供的活躍Statement數(shù)量可以達(dá)到幾百。 在節(jié)約網(wǎng)絡(luò)資源的同時(shí),縮短了每次會(huì)話周期(物理連接的建立是個(gè)費(fèi)時(shí)的操作)。但在一般的應(yīng)用中,多數(shù)按照2.1范例操作,這樣有10個(gè)程序調(diào)用,則會(huì)產(chǎn)生10次物理連接,每個(gè)Statement單獨(dú)占用一個(gè)物理連接,這是極大的資源浪費(fèi)。 ConnectionPool可以解決這個(gè)問題,讓幾十、幾百個(gè)Statement只占用同一個(gè)物理連接, 發(fā)揮數(shù)據(jù)庫原有的優(yōu)點(diǎn)。

通過ConnectionPool對(duì)資源的有效管理,應(yīng)用可以獲得的Statement總數(shù)到達(dá)

(并發(fā)物理連接數(shù)) x (每個(gè)連接可提供的Statement數(shù)量)

例如某種數(shù)據(jù)庫可同時(shí)建立的物理連接數(shù)為 200個(gè),每個(gè)連接可同時(shí)提供250個(gè)Statement,那么ConnectionPool最終為應(yīng)用提供的并發(fā)Statement總數(shù)為: 200 x 250 = 50,000個(gè)。這是個(gè)并發(fā)數(shù)字,很少有系統(tǒng)會(huì)突破這個(gè)量級(jí)。所以在本節(jié)的開始,指出資源的耗盡與應(yīng)用程序直接管理有關(guān)。

 

對(duì)資源的優(yōu)化管理,很大程度上依靠數(shù)據(jù)庫自身的JDBC Driver是否具備。有些數(shù)據(jù)庫的JDBC Driver并不支持ConnectionStatement之間的邏輯連接功能,如SQLServer,我們只能等待她自身的更新版本了。

 

對(duì)資源的申請(qǐng)、釋放、回收、共享和同步,這些管理是復(fù)雜精密的。所以,ConnectionPool另一個(gè)功能就是,封裝這些操作,為應(yīng)用提供簡(jiǎn)單的,甚至是不改變應(yīng)用風(fēng)格的調(diào)用接口。

 

3.     簡(jiǎn)單JDBC連接池的實(shí)現(xiàn)

根據(jù)第二章中原理機(jī)制,Snap-ConnectionPool(一種簡(jiǎn)單快速的連接池工具,可在www.下載)按照部分的JDBC規(guī)范,實(shí)現(xiàn)了連接池所具備的對(duì)數(shù)據(jù)庫資源有效管理功能。

 

3.1     體系描述

JDBC規(guī)范中,應(yīng)用通過驅(qū)動(dòng)接口(Driver Interface)直接方法數(shù)據(jù)庫的資源。為了有效、合理地管理資源,在應(yīng)用與JDBC Driver之間,增加了連接池: Snap-ConnectionPool。并且通過面向?qū)ο蟮臋C(jī)制,使連接池的大部分操作是透明的。參見下圖,Snap-ConnectionPool的體系:

 

圖中所示,通過實(shí)現(xiàn)JDBC的部分資源對(duì)象接口( Connection, Statement, ResultSet ),在 Snap-ConnectionPool內(nèi)部分別產(chǎn)生三種邏輯資源對(duì)象: PooledConnection, PooledStatement PooledResultSet。它們也是連接池主要的管理操作對(duì)象,并且繼承了JDBC中相應(yīng)的從屬關(guān)系。這樣的體系有以下幾個(gè)特點(diǎn):

 

-          透明性。在不改變應(yīng)用原有的使用JDBC驅(qū)動(dòng)接口的前提下,提供資源管理的服務(wù)。應(yīng)用系統(tǒng),如同原有的 JDBC,使用連接池提供的邏輯對(duì)象資源。簡(jiǎn)化了應(yīng)用程序的連接池改造。

-          資源封裝。復(fù)雜的資源管理被封裝在  Snap-ConnectionPool內(nèi)部,不需要應(yīng)用系統(tǒng)過多的干涉。管理操作的可靠性、安全性由連接池保證。應(yīng)用的干涉(如:主動(dòng)關(guān)閉資源),只起到優(yōu)化系統(tǒng)性能的作用,遺漏操作不會(huì)帶來負(fù)面影響。

-          資源合理應(yīng)用。按照JDBC中資源的從屬關(guān)系,Snap-ConnectionPool不僅對(duì)Connection進(jìn)行緩沖處理,對(duì)Statement也有相應(yīng)的機(jī)制處理。在2.3已描述,合理運(yùn)用ConnectionStatement之間的關(guān)系,可以更大限度地使用資源。所以,Snap-ConnectionPool封裝了Connection資源,通過內(nèi)部管理PooledConnection,為應(yīng)用系統(tǒng)提供更多的Statement資源。

-          資源連鎖管理。Snap-ConnectionPool包含的三種邏輯對(duì)象,繼承了JDBC中相應(yīng)對(duì)象之間的從屬關(guān)系。在內(nèi)部管理中,也依照從屬關(guān)系進(jìn)行連鎖管理。例如:判斷一個(gè)Connection是否超時(shí),需要根據(jù)所包含的Statement是否活躍;判斷Statement也要根據(jù)ResultSet的活躍程度。

 

3.2     連接池集中管理ConnectionManager

ConnectionPoolSnap-ConnectionPool的連接池對(duì)象。在Snap-ConnectionPool內(nèi)部,可以指定多個(gè)不同的連接池(ConnectionPool)為應(yīng)用服務(wù)。ConnectionManager管理所有的連接池,每個(gè)連接池以不同的名稱區(qū)別。通過配置文件適應(yīng)不同的數(shù)據(jù)庫種類。如下圖所示:

通過ConnectionManager,可以同時(shí)管理多個(gè)不同的連接池,提供通一的管理界面。在應(yīng)用系統(tǒng)中通過ConnectionManager和相關(guān)的配置文件,可以將凌亂散落在各自應(yīng)用程序中的數(shù)據(jù)庫配置信息(包括:數(shù)據(jù)庫名、用戶、密碼等信息),集中在一個(gè)文件中。便于系統(tǒng)的維護(hù)工作。

 

3.3     連接池使用范例

對(duì)2.1的標(biāo)準(zhǔn)JDBC的使用范例,改為使用連接池,結(jié)果如下:

import java.sql.*;

import net.snapbug.util.dbtool.*;

…..

 

ConnectionPool dbConn = ConnectionManager.getConnectionPool( "testOracle" );

 

Statement st = dbConn.createStatement();

ResultSet rs = st.executeQuery( “select * from demo_table” );

 

…some data source operation in here

 

rs.close();

st.close();

 

 

在例子中,Snap-ConnectionPool封裝了應(yīng)用對(duì)Connection的管理。只要改變JDBC獲取Connection的方法,為獲取連接池(ConnectionPool)(粗體部分),其他的數(shù)據(jù)操作都可以不做修改。按照這樣的方式,Snap-ConnectionPool可幫助應(yīng)用有效地管理數(shù)據(jù)庫資源。如果應(yīng)用忽視了最后資源的釋放: rs.close() st.close(),連接池會(huì)通過超時(shí)(time-out)機(jī)制,自動(dòng)回收。

 

4.     小結(jié)

無論是Snap-ConnectionPool還是其他的數(shù)據(jù)庫連接池,都應(yīng)當(dāng)具備一下基本功能:

-          對(duì)源數(shù)據(jù)庫資源的保護(hù)

-          充分利用發(fā)揮數(shù)據(jù)庫的有效資源

-          簡(jiǎn)化應(yīng)用的數(shù)據(jù)庫接口,封閉資源管理。

-          對(duì)應(yīng)用遺留資源的自動(dòng)回收和整理,提高資源的再次利用率。

在這個(gè)前提下,應(yīng)用程序才能投入更多的精力于各自的業(yè)務(wù)邏輯中。數(shù)據(jù)庫資源也不再成為系統(tǒng)的瓶頸。

: 在網(wǎng)站 www.可免費(fèi)下載Snap-ConnectionPool及更詳細(xì)的文檔。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(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)論公約

    類似文章 更多

    国产亚洲欧美一区二区| 激情三级在线观看视频| 精品丝袜一区二区三区性色| 久久精品一区二区少妇| 国产精品香蕉在线的人| 激情丁香激情五月婷婷| 亚洲综合激情另类专区老铁性| 好骚国产99在线中文| 欧美一区二区黑人在线| 国产精品午夜视频免费观看 | 加勒比人妻精品一区二区| 国产精品一区二区高潮| 国产亚洲精品一二三区| 免费在线成人激情视频| 婷婷亚洲综合五月天麻豆| 少妇高潮呻吟浪语91| 99福利一区二区视频| 九九热在线视频观看最新| 国产精品白丝久久av| 熟妇人妻av中文字幕老熟妇| 国产精品日本女优在线观看| 丝袜av一区二区三区四区五区| 一区二区三区日本高清| 中文字幕人妻综合一区二区| 国产三级不卡在线观看视频| 国产亚洲欧美日韩精品一区| 日韩国产亚洲欧美激情| 亚洲中文字幕在线乱码av| 国产精品亚洲综合天堂夜夜| 少妇成人精品一区二区| 日韩成人中文字幕在线一区 | 午夜福利国产精品不卡| 精品久久综合日本欧美| 中文字幕熟女人妻视频| 91熟女大屁股偷偷对白| 99视频精品免费视频播放| 一级欧美一级欧美在线播| 又黄又硬又爽又色的视频| 精品人妻一区二区三区免费看| 国产不卡的视频在线观看| 国产成人精品国产亚洲欧洲|