999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Java的數據庫連接池技術的算法實現

2009-04-09 03:17:18羅金濤李躍新
新媒體研究 2009年5期

羅金濤 李躍新

[摘要]數據庫連接池是一種非常高效實用的技術。對數據庫連接池的基本實現原理進行分析,并給出初步的算法實現。

[關鍵詞]數據源 連接池 連接 JAVA JDBC

中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0310052-02

一、引言

在任何的項目開發過程中,都離不開對數據的操作,這一系列的動作最終都體現在底層和數據庫的交互,在常規的jdbc數據庫操作到時候,總是要反復的打開和關閉對數據庫的連接,但是這個過程是一個相當消耗系統資源的過程,對于小的一般程序環境來說,似乎感覺不到性能的影響,但是對于一些多層結構大型企業級的應用程序環境來說,這種反復消耗系統資源的弊端就開始體現出來了。于是很多服務器產品都提供了連接池技術來提高數據庫操作的性能,通過連接池技術,可以盡可能多對內存資源進行重用,大大節約了內存的開銷,同時能夠支持更多的客戶服務和提高程序的運行效率,最終從整體上提高到了服務器的運行效率。

二、連接池的產生及基本原理

在早期的java項目開發過程中,當項目開發完成之后,運行的時候發現隨著訪問量的增長,系統的性能下降得特別的嚴重,實踐表面,導致系統性能下降的原因就是發生在數據庫訪問階段,而在此階段,有一個反復執行的動作,那就是建立和關閉Connection對象,由于關閉操作是在所有的數據庫動作執行之后才進行,它主要目的是釋放資源,而建立Connection對象的操作是在加載了數據庫驅動之后,數據庫操作之前必須完成的動作,而且這個對象的生成過程比較耗時,如果每次操作數據庫都臨時生成一個Connection對象,那么隨著并發訪問量的增加,必然會影響系統的性能,所以Connection對象的生成就是影響系統性能的主要原因,為了解決這個瓶頸,一個普遍可行的解決方案,就是在應用啟動的時候,一次性生成若干個Connection對象,而不是在每次操作數據庫的時候去臨時生成,這些一次性生成的若干個Connection對象就可以常駐內存中可以反復被使用,這樣就避免了Connection對象的創建過程耗時的缺陷,從而使得數據庫訪問速度得到了很大的提升,瓶頸有效的得到了緩解,這就是數據庫連接池技術的產生背景。

圖1顯示了數據庫連接池技術的基本原理。

當客戶端訪問需要對數據庫進行請求,需要先建立數據庫的連接對象Connection,此時是向數據源對象(DataSource)進行請求,而數據源對象預先一次性和數據庫(Database)建立好了若干個連接(Connection),并將這些連接組成一個連接池(Connection Pool),由應用程序動態的對連接池中的連接進行申請,使用和釋放。當請求的對象用完以后,不需要進行關閉,直接返回給連接池當中,以便其他請求可以重復使用。當并發的請求的數量多于連接池的連接數的時候,這些請求先在排隊請求隊列當中排隊等候,然后由應用程序根據連接池中的使用情況,動態的來增加連接數。

三、數據庫連接池基本功能的算法實現

因為連接池的建立已經在它基礎上的操作和對集合類型的操作非常相似,因此我們可以將整個實現過程通過對集合類型的對象操作來進行模擬實現,首先,我們要建立一個數據庫連接池類ConnectionPool,為了控制在取得連接的過程中只生成一個類的實例,應該用單態模式(Singleton)來設計這個連接池類,通過單態模式可以節省內存的開銷,同時也降低了Java虛擬機(JVM)進行垃圾回收的開銷。首先需要定義一個私有的構造方法,然后通過保留一個公開的靜態方法來取得這個類的實例,另外要有一個容器來保存生成的連接,在JAVA中,我們一般使用集合類型的對象,例如Vector,ArrayList都可以,但是考慮到多線程的安全性,我們一般使用Vector來進行封裝,其中用到的代碼片段如下:

首先定義一個名為ConnectionPool的類,里面用到的一系列屬性和幾個主要方法如下:

private Vector pool; //Vector類型的連接池對象

private String url; //數據庫訪問的url

private String username; //數據庫訪問的用戶名

private String password; //數據庫的密碼

private String driver; //數據庫的驅動類

private int poolSize; //連接池的大小,即連接的數量

private int initSize; //初始化連接的數量

private int poolSizeIncrement; //當連接數不夠時的容量的增量

private static ConnectionPool instance=null; //定義一個靜態的連接池類變量

//私有構造方法,讀取屬性文件的內容,建立指定數量的連接池中的初始連接。

private ConnectionPool(){

//讀取初始化配置參數,我們可以將數據庫參數保存在properties的屬性文件中,或者在xml文件中加以配置,推薦使用xml方式,可以提高系統解耦。

… … … …

//實例化一個向量,當作數據庫連接池對象的容器。

Vector pool=new Vector(poolSize, poolSizeIncrement);

//在連接池中創建指定數目的數據庫連接對象

for(int i=0;i

try{

Class.forName(driver);

Connection conn=java.sql.DriverManager.

getConnection(url,username,password);

}catch (SQLException e) {

e.printStackTrace();

}catch (ClassNotFoundException e) {

e.printStackTrace();

}

//將生成的Connection對象放入Vector中

pool.add(conn);

}

}

//靜態方法,用于初始化該連接池類的實例。

public static ConnectionPool getInstance(){

if(instance==null){

instance=new ConnectionPool();

}

return instance;

}

當我們通過上面的方法調用這個類的私有構造函數后,它就會根據配置文件中的參數,創建指定數量的數據庫連接,如果有程序需要進行數據庫訪問,那么可以給它分配一個連接,因為所有的連接對象都保存在一個Vector中,對于每個需要取得連接的請求,首先就讓它取得get(0)位置上連接對象,并將它從Vector中刪除,從而保證Vector中剩下的都是可用的連接。相反,當一個連接用完以后,就應該釋放這個連接,并且將這個剛剛釋放的連接重新加入到連接池Vector中,其具體代碼如下:

//返回連接池中的一個數據庫連接,用戶自己來調用以取得數據庫的連接對象。

public synchronized Connection getConnection(){

if(pool.size()>0){

Connection conn=(Connection)pool.get(0);

//取得連接后,從連接池中刪除

pool.remove(conn);

return conn;

}else{

return null;

}

}

//釋放連接方法,需要用戶自己來調用這個方法。

public synchronized void closeConnection(Connection conn){

//返回到連接池中,即將這個Conncetion對象加入到Vector中最前面。

pool.add(0,conn);

}

如果最后我們的要關閉所有的連接,那么就要直接關閉數據庫連接池,那么可以通過遍歷,依次連接池對象中的每個連接,同時可以從vector對象中移除,代碼如下所示:

publicsynchronized void closePool(){

//通過遍歷的方式依次關閉Conncetion對象

for(int i=0;i

try{

((Connection)pool.get(i)).close();

}catch(SQLException e){

e.printStackTrace();

}

//從Vector中移除

pool.remove(i);

}

}

以上就是基于數據庫連接池技術的基本原理及用java代碼的算法實現過程,當我們需要使用連接池技術時,首先我們通過ConnectionPool.getI

nstance()方法取得連接池實例,然后會自動調用私有的構造方法ConnectionPool()取得相應數據庫連接參數,并在Vector中生成指定數目的Conncetion對象,在程序中我們就可以通過調用getConnection()方法來取得連接了,因為此時的連接不是臨時生成的,而是在連接池初始化時就生成了,所以這個取得Conncetion對象的過程的效率非常高,最后我們可以調用closeConnection(Connection conn)和closePool()方法依次關閉Conncetion和連接池。測試表明,通過連接池技術的來訪問數據庫比不使用連接池技術時效率要高很多,當數據庫訪問量大時,采用連接池技術的優勢更加明顯。

目前可用的數據庫連接池組件也很多,例如C3PO,DBCP,PROXOOL等都是一些優秀的連接池組件,我們只需要在程序中引入相關的類庫,然后通過相關的參數配置或者實現相應的接口和方法,都可以很方便地在實際的項目中使用它們提供的數據庫連接池技術了,另外在很多服務器中,如Tomcat,Jboss,WebLogic,WebSphere都內置提供了對數據庫連接池的支持,例如在Tomcat中本身也帶有連接池的功能,它是通過配置數據源(DataSource)參數來實現的連接池功能,通過在配置文件的相應位置加入如下代碼 ,我們只需要設置好相關參數,就完成了對數據源(DataSource)的配置,然后在程序當中加入以下語句就可以取得數據源的連接了Context context = new InitialContext();

DataSource ds = (DataSource)context.lookup("");

con=ds.getConnection();

值得特別注意的是,有了這個連接,我們可以像平時一樣操作數據庫了,而且我們可以執行con.close();讓連接池收回這個連接,但和普通連接不同的是,此時并沒有關閉到數據庫的物理連接,所以下次請求的時候不會重新生成新的連接,這也是使用連接池技術的好處,以上數據源的配置也是建立在連接池技術的基本原理之上的,例如,name,username,passw

Ord,driverClassName,url等參數實際上就是和數據庫訪問相關的參數,另外,maxActive代表最大連接數,maxIdle表示最大空閑數,maxWait代表最大等待數,這些額外的參數只是各個服務器廠商提供的連接池的額外屬性。

四、結束語

本文是從數據庫連接池最基本的原理著手,從最基本的層面分析了數據庫連接池技術的核心原理,并用Java語言實現了核心代碼,目前的數據庫連接池組件很豐富,功能也各不相同,但是其核心原理都差不多,都是在數據庫連接池技術的最基本的功能上的不斷完善與創新。

參考文獻:

[1]閻宏,Java與模式[M].北京:電子工業出版社,2002年10月.209-227.

[2]李剛,輕量級J2EE企業應用實戰[M].北京:電子工業出版社,2007年04月.390-399.

[3]劉曉華、張健、周慧貞,JSP應用開發詳解[M].北京:電子工業出版社,2007年07月.323-327.

作者簡介:

羅金濤,男,漢族,湖北咸寧人,碩士,研究方向:人工智能,并行計算;李躍新,男,漢族,湖北武漢人,副教授,研究方向:人工智能,并行計算。

主站蜘蛛池模板: 国产麻豆精品久久一二三| 激情网址在线观看| 亚洲欧美日本国产专区一区| 久久婷婷国产综合尤物精品| 欧美无专区| 国产男女免费视频| 久久亚洲天堂| a毛片在线播放| 香蕉久人久人青草青草| 一区二区午夜| 国产精品性| 中文字幕久久波多野结衣 | 欧美三級片黃色三級片黃色1| 亚洲免费福利视频| 玖玖精品视频在线观看| 国产麻豆另类AV| 色婷婷天天综合在线| 精品午夜国产福利观看| 欧美综合成人| 久久视精品| 国内熟女少妇一线天| 国产黄在线免费观看| 五月婷婷亚洲综合| 亚洲成人77777| 亚洲第一极品精品无码| 成人毛片免费在线观看| 久久久久久久蜜桃| 亚洲欧美日韩久久精品| 谁有在线观看日韩亚洲最新视频| 40岁成熟女人牲交片免费| 伊人激情久久综合中文字幕| 国产黄色免费看| 全部无卡免费的毛片在线看| 国产成人免费高清AⅤ| 91麻豆久久久| 亚洲欧美综合在线观看| 亚洲视频免费在线看| 日本人妻一区二区三区不卡影院| 亚洲an第二区国产精品| 成人午夜视频免费看欧美| 四虎永久在线| 99精品这里只有精品高清视频| 99草精品视频| 在线不卡免费视频| 999精品视频在线| 亚洲精品片911| 国产av一码二码三码无码 | 成人一区专区在线观看| 午夜限制老子影院888| 国产人碰人摸人爱免费视频| 呦女亚洲一区精品| 国产在线观看一区精品| 久久久久久国产精品mv| 国产在线观看一区精品| 国产成人8x视频一区二区| 久久久久久久蜜桃| 狠狠色噜噜狠狠狠狠色综合久| 一本大道无码日韩精品影视| 视频一区亚洲| 波多野结衣久久高清免费| 精品亚洲麻豆1区2区3区| 国产一区二区影院| 精品国产毛片| 欧美亚洲综合免费精品高清在线观看| 国产精女同一区二区三区久| 色哟哟国产精品| 免费播放毛片| 国产尤物在线播放| 国产视频入口| 韩国福利一区| 伊人激情综合网| 美女免费黄网站| 22sihu国产精品视频影视资讯| 欧美日一级片| 精品在线免费播放| 亚洲精品麻豆| 四虎影视8848永久精品| 波多野吉衣一区二区三区av| 毛片卡一卡二| 三级视频中文字幕| 国产激爽大片高清在线观看| 国产精品开放后亚洲|