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