四、類DBConnectionManager 說明
該類只能創(chuàng)建一個實(shí)例,其它對象能夠調(diào)用其靜態(tài)方法(也稱為類方法)獲得該唯一實(shí)例的引用。如031至036行所示,DBConnectionManager類的建構(gòu)函數(shù)是私有的,這是為了避免其它對象創(chuàng)建該類的實(shí)例。
DBConnectionManager類的客戶程序可以調(diào)用getInstance()方法獲得對該類唯一實(shí)例的引用。如018至029行所示,類的唯一實(shí)例在getInstance()方法第一次被調(diào)用期間創(chuàng)建,此后其引用就一直保存在靜態(tài)變量instance中。每次調(diào)用getInstance()都增加一個DBConnectionManager的客戶程序計數(shù)。即,該計數(shù)代表引用DBConnectionManager唯一實(shí)例的客戶程序總數(shù),它將被用于控制連接池的關(guān)閉操作。
該類實(shí)例的初始化工作由146至168行之間的私有方法init()完成。其中 getResourceAsStream()方法用于定位并打開外部文件。外部文件的定位方法依賴于類裝載器的實(shí)現(xiàn)。標(biāo)準(zhǔn)的本地類裝載器查找操作總是開始于類文件所在路徑,也能夠搜索CLASSPATH中聲明的路徑。db.properties是一個屬性文件,它包含定義連接池的鍵-值對?晒┒x的公用屬性如下:
drivers 以空格分隔的JDBC驅(qū)動程序類列表
logfile 日志文件的絕對路徑
其它的屬性和特定連接池相關(guān),其屬性名字前應(yīng)加上連接池名字:
.url 數(shù)據(jù)庫的 JDBC URL
.maxconn 允許建立的最大連接數(shù),0表示沒有限制
.user 用于該連接池的數(shù)據(jù)庫帳號
.password 相應(yīng)的密碼
其中url屬性是必需的,而其它屬性則是可選的。數(shù)據(jù)庫帳號和密碼必須合法。用于Windows平臺的db.properties文件示例如下:
drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.idbDriver
logfile=D:\\user\\src\\java\\DBConnectionManager\\log.txt
idb.url=jdbc:idb:c:\\local\\javawebserver1.1\\db\\db.prp
idb.maxconn=2
access.url=jdbc:odbc:demo
access.user=demo
access.password=demopw
注意在Windows路徑中的反斜杠必須輸入2個,這是由于屬性文件中的反斜杠同時也是一個轉(zhuǎn)義字符。
init()方法在創(chuàng)建屬性對象并讀取db.properties文件之后,就開始檢查logfile屬性。如果屬性文件中沒有指定日志文件,則默認(rèn)為當(dāng)前目錄下的DBConnectionManager.log文件。如日志文件無法使用,則向System.err輸出日志記錄。
裝載和注冊所有在drivers屬性中指定的JDBC驅(qū)動程序由170至192行之間的loadDrivers()方法實(shí)現(xiàn)。該方法先用StringTokenizer將drivers屬性值分割為對應(yīng)于驅(qū)動程序名稱的字符串,然后依次裝載這些類并創(chuàng)建其實(shí)例,最后在 DriverManager中注冊該實(shí)例并把它加入到一個私有的向量drivers。向量drivers將用于關(guān)閉服務(wù)時從DriverManager取消所有JDBC 驅(qū)動程序的注冊。
init()方法的最后一個任務(wù)是調(diào)用私有方法createPools()創(chuàng)建連接池對象。如109至142行所示,createPools()方法先創(chuàng)建所有屬性名字的枚舉對象(即Enumeration對象,該對象可以想象為一個元素系列,逐次調(diào)用其nextElement()方法將順序返回各元素),然后在其中搜索名字以“.url”結(jié)尾的屬性。對于每一個符合條件的屬性,先提取其連接池名字部分,進(jìn)而讀取所有屬于該連接池的屬性,最后創(chuàng)建連接池對象并把它保存在實(shí)例變量pools中。散列表(Hashtable類 )pools實(shí)現(xiàn)連接池名字到連接池對象之間的映射,此處以連接池名字為鍵,連接池對象為值。
為便于客戶程序從指定連接池獲得可用連接或?qū)⑦B接返回給連接池,類DBConnectionManager提供了方法getConnection()和freeConnection()。所有這些方法都要求在參數(shù)中指定連接池名字,具體的連接獲取或返回操作則調(diào)用對應(yīng)的連接池對象完成。它們的實(shí)現(xiàn)分別在051至064行、066至080行、038至049行。
如082至107行所示,為實(shí)現(xiàn)連接池的安全關(guān)閉,DBConnectionManager提供了方法release()。在上面我們已經(jīng)提到,所有DBConnectionManager的客戶程序都應(yīng)該調(diào)用靜態(tài)方法getInstance()以獲得該管理器的引用,此調(diào)用將增加客戶程序計數(shù)?蛻舫绦蛟陉P(guān)閉時調(diào)用release()可以遞減該計數(shù)。當(dāng)最后一個客戶程序調(diào)用release(),遞減后的引用計數(shù)為0,就可以調(diào)用各個連接池的release()方法關(guān)閉所有連接了。管理類release()方法最后的任務(wù)是撤銷所有JDBC驅(qū)動程序的注冊。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |