




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
本科畢業論文(設計)論文(設計)題:基于java數據庫連接池的研究學院:數學與統計學院專業名稱:信息與計算科學摘要在基于JDBC的數據庫實際應用開發中,對數據庫連接的管理是一個重點也是一個難點,頻繁對數據庫的連接與關閉操作·多客戶對數據庫的并發訪問,一定程度上決定了WEB系統的響應以及應用性能。使用數據庫連接池方式能對數據庫的連接進行管理和維護,上層應用程序通過數據庫連接池使用數據庫資源能提升系統性能,充分利用系統資源。文章通過介紹·分析數據庫連接池工作的基本原理,了解目前流行的WEB服務器在數據庫連接池方面的使用現狀后,總結一了些數據庫連接池開發程序中容易忽略的問題。并在學習掌握了實現連接池的關鍵技術后給出了一個較為高效的連接池管理策略在這種策略思想的指導下實際開發出一個數據庫連接池模塊,使得上層應用通過本連接池訪問數據庫資源變得相對高效和容易,從實際上論證了這種設計方案的可行性。關鍵詞:連接池;數據庫;JDBC;并發訪問
Research
and
realization
of
the
Database
Connection
Pool
Abstract
In
the
practically
application
development
of
database
based
on
JDBC,
the
management
of
database
connection
is
a
key
point
and
also
a
difficulty.
The
response
and
performance
of
the
WEB
system
are
depended
on
frequently
connecting,
closing
and
multi-user
accessing
in
a
certain
extent.
Using
the
Database
Connection
Pool
can
provide
management
and
maintenance
for
connections
of
the
database.
The
upper
applications
may
access
the
database
recourse
via
the
Database
Connection
Pool,
in
order
to
upgrade
system
performance
and
fully
utilize
the
system
recourse.
This
article
summarizes
some
issues
which
are
feasibility
of
this
design
project
in
practice.
Key
words
:
Database
Connection
Pool
;
Database
;
JDBC
;
Concurrence
access
目錄1引言 11.1 課程背景 11.2 連接池的主要作用 11.3 目前流行的WEB服務器數據庫連接池方面使用現狀 11.3.1DHCP介紹 21.3.2poolman介紹 21.3.3C3P0介紹 21.3.4其他連接池(自寫連接池) 22相關理論基礎 32.1 數據庫概論 32.2 數據庫連接池的基本原理 32.3 連接池中的關鍵技術 42.3.1連接池的分配與釋放 42.3.2連接池的維護 53系統總體設計思想及方案 53.1 連接池中的關鍵類設計 63.2 連接池中的管理機制 73.3 實現一個連接池的其他問題 83.3.1事務處理 83.3.2封裝 93.3.3并發 93.3.4連接池的關閉 94具體的設計流程和實現 104.1 連接池的建立 104.2 連接池的管理 124.3 連接池的關閉 144.4 連接池的測試 155系統測試問題的總結 155.1 連接池的泄露問題 155.1.1產生現象 155.1.2解決辦法 165.2 多數據庫服務器問題 176總結 19參考文獻 20謝辭 211引言
1.1課題背景
隨著信息技術的高速發展與廣泛應用,數據庫技術在信息技術領域中的位置越來越重要。傳統的開發模式是:首先在主程序(如Servlet、Beans)中建立數據庫連接;然后進行SQL操作,對數據庫中的對象進行查詢,修改和刪除等;最后斷開數據庫連接。使用這種開發模式,對于一個簡單的數據庫應用,由于數據庫的訪問不是很頻繁,只需要在訪問數據庫時創建一個連接,用完后就關閉它,這樣做不會明顯增大系統的開銷但是對于一個復雜的數據庫應用,情況就完全不同了,尤其是大型電子商務網站,同時可能有幾百人基至幾千人在線。在這種情況下,用戶操作頻繁的建立、關閉數據庫,會極大的降低系統的性能,增大系統的開銷,迫使網站的響應速度下降,嚴重的甚至會造成服務器的崩潰。針對這些突出問題,采用運行速度更快,數據庫訪問效率更高的數據庫連接池技術,以提高系統的運行效率將是至關重要的,因此本文提出了一種基于數據庫連接池技術的有效解決方法。以加強對數據庫操作的性能,改善資源使用率,提高應用程序的響應能力。
1.2連接池的主要作用
一個應用系統,同時有幾百人縣至幾千人頻繁的進行數據庫連接操作勢必占用很多的系統資源,嚴重的基至會造成服務器的崩潰。對于每一次數據庫連接,使用完后都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統中的內存泄漏,最終將不得不重啟數據庫。還有,如果不能控制被創建的連接對象數,系統資源會被毫無顧及的分配出去,連接過多也可能導致內存泄漏,服務器崩潰。針對這些突出問題,因此提出了一種基于數據庫連接池技術的有效解決方法。簡而言之,數據庫連接池主要作用是負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不再是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。
1.3目前流行的web服務器數據庫連接池方面使用現狀
由于JDBC的API中沒有提供連接池的方法。一些大型的WEB應用服務器如WebLogic、Websphere等都自帶有連接池。不同的是,tomcat并沒有自已發連接池,而是集成的apache的另外一個開源項目DBCP連接池。BEA的WebLogic自身帶有一個連接池,這個連接池無法與WebLogic分離,但是也必須有其第三方的專用類方法支持連接池的用法,而不需要用戶再去寫一個連接池。以下是一些第三方連接池:1.3.1DHCP介紹
DBCP應Apache的Jakarta組織開發,是目前使用較為廣泛的一個連接
池,一是因為tomcat自帶的就是這個連接池,二是因為開源免費。由于其使用的穩定性不是很好,普名的開源項目hibernate不再提供對它的支持。DBCP部分參數說明如下:
datasource:要連接的datasource(通常我們不會定義在server.
xml)。defaultAutocommit:對于事務是否autocommit,默認值為true。
defaultReadonly:對于數據庫是否只能讀取,默認值為false。
driverclassName:連接數據庫所用的
JDBC
Driver
Class。maxActive:最大連接數據庫連接數,設0為沒有限制。
maxldle:最大等待連接中的數量,設0為沒有限制。
maxwait:最大等待秒數,單位為ms,超過時間會出錯誤信息。
password:登陸數據庫所用的密碼。
url:連接數據庫的URL。
username:登陸數據庫所用的帳號。
validationQuery:驗證連接是否成功,SQL
SELECT指令至少要返回一行。removeAbandoned:是否自我中斷,默認是false。
removeAbandonedTimeout:幾秒后會自我中斷,removeAbandoned必
須為true。IogAbandoned:是否記錄中斷事件,默認為false。
1.3.2Poolman介紹
Poolman連接池前幾年應用較廣泛現在應用相對較少。配置步驟主
要是先在/項日名稱/web-Inf/下加入一jar包,然后配置一個xml文件,文
件屬性類似于DBCP,最后在程序中寫出調用該連接池的方法。
1.3.3C3PO介紹
C3PO是一個開放源代碼的JDBC
連接池,它在lib目錄中與Hibernate一
起發布,包括了實現JDBC3.0和JDBC2.0擴展規范說明的Connection
和Statement池的Datasource對象。自從hibemate自帶了c3po以后,c3po很快就受到了廣大程序員的認可,其性能上來說比DBCP要好的多。1.3.4其他連接池(自寫連接池)
有些程序員喜歡自己寫連接池,建議不用這樣的方法,因為連接池的
管理較為復雜,自己寫常出現各種各樣的錯誤,推薦使用有成熟技術的連接
池,同時也方便系統的移植。
2相關理論基礎
2.1數據庫概述
數據庫,顧名思義,是存人數據的倉庫。只不過這個倉庫是在計算機
存儲設備上的,而且數據是按一定格式存放的。當人們收集了大量的數據后,應該把它們保存起來進入近一步的處理,進一步的抽取有用的信息。當年人們把數據存放在文件柜中,可現在隨著社會的發展,數據量急劇增長,現在人們就借助計算機和數據庫技術科學的保存大量的數據,以便能更好的利用這些數據資源。要是下定義的話,就應該是:指長期儲存在計算機內的,有組織的,可共享的數據集合。
數據庫包含關系數據庫,面向對象數據庫及新興的XML數據庫等多種,目前應用最廣泛的是關系數據庫,若在關系數據庫基礎上提供部分面向對象數據庫功能的對象關系數據庫。在數據庫技術的早期還曾經流行過層次數據庫與網狀數據庫,但這兩類數據庫目前已經極少使用。
2.2數據庫連接池的基本原理建立“緩沖存儲池”,是數據庫連接池的基本設計思想。這種技術類似于CPU中的Cache技術,將預先設定好的數據庫連接放入該緩沖池中,當要建立數據庫連接操作時,便從池中取出一個連接,使用完畢后再將其放回。這樣就達到了連接復用的目的,應用程序重復使用一個數據庫連接,在多層結構的應用程序中通過連接池技術可以使系統的性能明顯得到提到。最為關鍵的是,該方法避免了對數據庫連接的頻繁建立、關閉,減小了系統開銷,提高了響應速度。我們可以通過設定連接池最大連接數來防止系統無盡的與數據庫連接。更為重要的是我們可以通過連接池的管理機制監視數據庫的連接的數量,使用情況,為系統開發,測試及性能調整提供依據。數據庫連接池屬于應用程序對底層的調用,用戶并發訪問應用程序時會提交訪問請求,然后通過線程來處理這些請求,并向連接池申請一個對數據庫操作的連接,操作完畢后將連接釋放。應用程序調用連接池
連接的基本工作原理如下圖所示:基于以上原理,連接池的建立會在后面章節中做具體描述。為了方便理解,連接池以JSP頁面形式將最大連接數的設置、連接池的使用、超時等待、連接池的關閉等情況展示出來,給用戶一個更為直觀的感受。連接的調用原理如下圖所示:從圖中可以看出當程序(JSP.
Servlet.
Java
Bean)
中需要數據庫連接時,只需從內存中取出一個來,并將這個取得的連接加入Vector中,而不用新建連接;使用完畢后放回內存中,并將Vector中的已用連接刪除。2.3連接池中的關鍵技術2.3.1連接池的分配與釋放
連接池的分配與釋放技術對系統的性能有很大的影響。合理的分配與釋放,可以提高連接的復用度,從而降低建立新連接的開銷,同時還可以加快用戶的訪問速度。對于連接的管理。每當用戶請求一個連接時,系統首先檢查連接池內有沒有空閑連接。如果有就把建立時間最長(通過容器的順序存放實現)的個連接分配給他(實際是先做連接是否有效的判斷,如果可用就分配給用戶,若不可
用就把這個連接刪掉,重新檢測是否還有連接);如果檢查到當前所開連接池沒有達到連接池所允許的最大連接數(maxconn),就新建一個連接,如果已經達到,就等待一定的時間(timeout)。如果在等待的時間內有連接被釋放出來就可以把這個連接分配給等待的用戶,如果等待時間超過預定時間timeout,則返回空值(null)
系統對已經分配出去正在使用的連接只做計數。2.3.2連接池的維護數據庫連接池到底要放置多少個連接,這是個配置策略。為了使系統的性能達到最佳狀態,連接池中的連接數的設定顯得尤為重要,我們采用設置最大連接數(maxconn)和最小連接數(minconn)的方式來解決這一問題。所謂最大連接數,即連接池中允許連接的最大數目,然后,最大連接數的設定要通過具體的應用需求來給出一個連接池可以承受的最大連接數目的最佳點。如果應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中,等待其他連接的釋放后再來調用一空閑連接(freeconn),這樣可能會影響部分對數據厙的操作。所謂最小連接數,即應用啟動前,已經預先創建好的連接數。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。如果最小連接數過大,么系統啟動過程將變慢,若應用程序對數據庫的訪問量不大,過多的數據庫連接資源將被浪費,但是系統啟動后響應更快;如果過小系統啟動將加快,但是最初使用的用戶會因為連接池中沒有足夠的連接而會發送一個新的數據庫連接請求,將不可避免的延緩執行速度。3
系統總體設計思想及方案
數據庫連接池技術的設計思想非常簡單,先將數據庫連接作為對象存儲在一個Vector對象中,Vector類可以實現可增長的對象“數組”。Vector
的大小可以根據需要增大或縮小,以適應創建Vector后進行添加或移除項的操作。這里主要包含使用的連接(nowconnections)和未使用的連接(freeconnections)
兩個
Vector
類創
建的對象,創建Vector對象的方法如下:
public
DBConnectionpool(vector
connections){
freeconnections=new
Vectoro();nowconnections
=
new
Vector();
}當外部程序向數據庫申請建立連接后系統會調用nowconnections.add()方法,此時已用連接計數器加1,相應的,調用freeconnections.Removei()方法,此時空閑連接計數器減1,對于這樣的引用計數法將會在后面的章節中具體
描述。這樣,不同的數據庫訪問請求就可以共享這些連接,并通過復用這些已經建立的數據庫連接,克服傳統開發模式對數據庫操作的缺點。另外,采用超時判斷(timeout)機制,等待應用程序對連接的釋放或者調用Connection.close()方法主動釋放連接,能極大地節省系統資源和用戶等待時間。而實現連接池時,當應用程序調用Connection.close()試圖去關閉數據庫連接時,這時需要有一個通告給連接池實現模塊,通告對當前的數據庫物理連接(DBConnectionPool
對象)進行重用。為了使連接池實現模塊能得到這種“通告”,連接池實現模塊必須實現ConnectionEventListener
接口,而且同時需要注冊成為DBConnectionPool
對象的監聽者。連接池實現模塊接受到此通告后,不是真正意義上的物理獎閉、而是將DBConnectionPool對象返回到池中進行重用。從上面的介紹,可以看出連接池技術的關鍵就是其自身的管理機制,結合連接池工作
的基本原理,通過下圖展現出一個連接池系統的總體設計框架。3.1連接池中的關鍵類設計
一個連接池應用的設計,需要幾個關鍵部分作為支撐,其中最為重要
的是DBConnectionPool類和DBConnectionManager類,他們對連接的建立、管理、釋放起決定性作用。大體作用列舉如下:
1.一個DBConnectionpool類,該類負責從連接池獲取(或創建)連接、將連接返回給連接池、空閑連接的超時等待、系統關閉時釋放所有資源并關閉所有連接。
2.Datasourceproviderservlet類,該類
負責通過上下文環境讀取配置文件后裝載和注冊JDBC驅動、數據庫名等。
3.一個DBConnection
Manager
類,該類負責按預先指定的最大連接
池數連初始化連接池、創建DBConnectionpool對象provider.當
所有的連接客戶退出后,關閉全部連接。4.DBperties屬性文件,該文件中包含了數據庫驅動(DriverName)、數據庫URL、數據庫表空間名(User)、表空間密碼(Passwold)、連接池最大連接數(maxconnections)
5、即為應用程序對連接池中的連接的調用和釋放,應用程序退出后連接池的關閉。將以上5個部分串連起來,即是本連接池的簡單設計流程。首先應用程序向連接池申請連接,就需要通過DBConnectionpool類,DBConnectionManager類對連接池初始化并且還需要Datasourceproviderservlet類的幫助讀取DBpe西es文件中的屬性,加載和注冊JDBC驅動,數據庫名等,連接池才能初始化成功。之后通過DBConnectionPool類監視,管理應用程序調用,釋放的數據庫連接,并通過該類的cp對象將連接使用情況反映在頁面上。連接池管理程序得到某個連接,而其他線程就不會得到這個數據庫連接了,此線程使用結束后,該線程將連接交還給連接池管理程序,以分配給其他等待連接的請求
線程。這里連接池充分利用Java的線程同步機理,使當前服務線程處于等待狀態,直至有空閑的連接出現。最后當應用程序退出時,通過DBConnectionManager類負責連接池的關閉。3.2連接池中的管理機制應用程序開發中“三分技術、七分管理”的思想在連接池的配置中同樣得以體現,如何從連接池中取得連接,何時釋放連接、如何釋放連接等問題還需要為連接池配置更為復雜的管理機制,連接池流程的管理如下圖所不,這些屬性定義了連接池與其中每個連接的有效狀態值。連接池的自我管理,實際上就是通過定時的對每個連接的狀態、連接的數量進行判斷而進行相應操作。3.2.1事務處理前面討論的是關于使用數據庫連接進行普通的數據庫訪問。對于事務處理,情況就變得比較復雜。因為事務本身要求原則性的保證,此時就要求對于數據庫的操作符合要么全部完成,要么什么都不做。如果簡單的采用上述的連接復用的策略,就會發生問題,因為沒有辦法控制屬于同一個事務的多個數據庫操作方法的動作,可能這些數據庫操作是在多個連接上進行的,并且這些連接可能被其他非事務方法復用。Connectio日本身具有提供了對于事務的支持,可以通過設置Connection的Autocommit屬性為false,顯式的調用commit或roHback方法來實現。但是要安全、高效的進行連接復用,就必須提供相應的事務支持機制。方法是:采用顯式的事務支撐方法,每一個事務獨占一個連接。這種方法可以大大降低對于事務處理的復雜性,并且又不會妨礙連接的復用。
連接管理服務提供了顯式的事務開始結束(commit或「o11back)聲明,以及一個事務注冊表,用于登事務發起者和事務使用的連接的對應關系,通過該表,使用事務的部分和連接管理部分就隔離開,因為該表是在運行時根據實際的調用情況動態生成的。事務使用的連接在該事務運行中不能被復用。在實現中,用戶標識是通過使用者所在的線程來標識的。后面的所有對于數據庫的訪問都是通過查找該注冊表,使用已經分配的連接來完成的。當事務結束時,從注冊表中刪除相應表項。3.2.2封裝
從上面的論述可以看出,普通的數據庫方法和事務方法對于連接的使用(分配,釋放)是不同的,為了便于使用,對外提供一致的操作接口對連接進行了封裝:普通連接和事務連接,并利用了Java中的強大的面向對象特性;多態。普通連接和事務連接均實現了一個DBConnection接口,對于接口中定義的方法,分別根據自己的特點作了不同的實現,這樣在對于連接的處理上就非常的一致了。
3.2.3并發
為了使連接管理服務有更大的通用性,我們必須要考慮到多線程環境,即并發問題。在一個多線程的環境下,必須要保證連接管理自身數據的一致性和連接內部數據的一致性,(synchronized關鍵字),這樣就很容易使連接管理成為線程安全的。對于并發訪問,所有的當前請求都將被連接池管理程序按順序鎖定。對請求線程的鎖定是通過應用程序代碼進行的,且請求數量可以很大,不必擔心超出緩沖容量限制。一旦將連接交還給連接池,該連接將由連接池管理程序分配給其他鎖定的請求。當有很多數據庫請求并超出了連接池中連接的數目時,只有先發出數據庫請求的線程獲得連接來訪問數據庫,其他連接暫時處于等待的鎖定狀態,當線程完成數據庫操作并釋放連接后,被釋放的連接將按順序由其他線程獲得,這樣就可以大大節省服務器的資源。
3.2.4連接池的關閉
很多的連接池都要求用戶通過其規定的方法獲取數據庫的連接,這一點我們可以理解,畢竟目前所有的應用服務器取數據庫連接的方式都是這種方式實現的。但是另外一個共同的問題是,它們同時不允許使用者顯式的調用Connection.closeo方法,而需要用其規定的一個方法來關閉連接。這種做法有兩個缺點:
第一:改變了用戶使用習慣,增加了用戶的使用難度。使用者在用完數據庫連接后通常是直接調用連接的close方法來釋放數據庫資源。
第二:使連接池無法對之中的所有連接進行獨占控制。由于連接池不允許用戶直接調用連接的close方法,一旦使用者在使用的過程中由于習慣問題直接關閉了數據庫連接,么連接池將無法正常維護所有連接的狀態。
4具體的設計流程和實現
4.1連接池的建立應用程序中建立的連接池其實是一個靜態的。所謂靜態連接池是指連
接池中的連接在系統初始化時就已分配好,且不能隨意關閉連接。Java中提了很多容器類可以方便的構建連接池,如:Vector.Stack.Servlet.Bean等,通過讀取連接屬性文件DBperties與數據庫實例建立連接。(該屬性文件中包含了連接數據庫的URL、數據庫驅動、數據庫表空間、數據庫表空間密碼、連接池最大連接數)在系統初始化時,根據相應的配置創建連接并放置在連接池中,
這些對象作為系統可分配的自由連接,以后所使用的連接都是從連接池中獲得,這樣就避免了隨意建立連接,關閉連接所帶來的資源浪費。
連接池初始化如下:
publicDBConnectionpool(vectorconnections){Freeconneetions
=
new
Vector();
nowconnections
=
new
Vector();
freeconnections=connections;
maxconnections
=freeconnections.Size()
;
}
本連接池的建立使用輸入流,通過上下文環境,讀取配置文件
(Dbconfig.Prooperties)里預先設置的參數,部分代碼如下:
public
void
contextlnitialized(servletcontextEvent
event)
{Properties
Properties();
Vector
connections
=
new
Vector();
Servletcontext
context
=
event.
Getservletcontext();
try
{//使用輸入流:讀取配置文件里的各種參數
Inputstream
inputgetclasso.
GetResourceAsstream("/
DBconfig.
properties")
;
ps.
Ioad
(input)
;
input.
closeo
;
url
=
(String)
ps.
Get("url")
;
User=(String)
ps.
Get("use{')
;
password
=(String)ps.
Get("password")
;
DriverName
=
(string)ps.
Get("DriverName")
;
maxconnections=Integer.parselnt(((
String)
ps.
Get("maxconnections")).
Trim(),10);
System.
out.
println
(user)
;
//循環加入取得的連接到vector中for(inti=0;i<maxconnections;i++){//調用下面的方法,取得數據庫連接,并放入到Vector中connections.Add(getconnection(url,user,password,DriverName)):}}catch
(Exception
e)
{e.
printstackTrace()
;
}//放到服務器的上下文環境中context.setAttribute("CONNECTOR",new
DBConnectionpool(connections));}連接池初始化參數通過頁面設置寫入DBpeties文件中,如下圖所示:4.2連接池的管理連接池管理策略是連接池機制的核心。當連接池建立后,如何對連接池中的連接進行管理,解決好連接池內連接的分配和釋放,對系統的性能有很大的影響。連接的合理分配,釋放可提高連接的復用,降低了系統建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配,釋放策略。連接池的分配,釋放策略對于有效復用連接非常重要。就一般情況而言,當客戶釋放數據庫連接時,先判斷該連接的引用次數是否超過了規定值,如果超過就刪除該連接,并判斷當前連接池內總的連接數是否小于minconn(最小連接數),若小于就將連接池充滿;如果沒超過就將該連接標記為開放狀態,可供再次復用。可以看出正是這套策略保證了數據庫連接的有效復用,避免頻繁地建立、釋放連接所帶來的系統資源開銷。我們采用的方法是一個很有名的設計模式:ReferenceCounting(引用記數)。該模式在復用資源方面應用的非常廣泛,把該方法運用到對于連接的分配釋放上,為每一個數據庫連接,保留一個引用記數,用來記錄該連接的使用者的個數。具體的實現方法是:
public
synchronized
Connection
getconnection(int
Timeout)
{
Connection
con=null
;
if
(freeconnections.Size()
<=
O)
{
System.out.println(”連接失敗,由于數據庫連接池中無可用連接!請
等待!”);try
{
new
DBConnection
Managero.
closeAll();
}
catch
(Exception
ex)
{
ex.
printstackTraceo
;
}
return
con
;
}else
{
Connection
temp=(Connection)
freeconnections.FirstElement();
freeConnections.remove(temp)
;
nowConnections.add(temp)
;
return
temp
;
}}
當應用程序向數據庫發起連接請求時,會檢查連接池中是否存在空閑
的連接。如果存在空閑的連接,連接池則把空閑連接分配給客戶,并將該連接做相應處理,即標記為正在使用的連接,并將引用計數加1。如果不存在空閑連接,則檢查連接池里的連接數是否已經達到了最大連接數(maxconn),若沒有達到就為應用程序創建一個新的誶榕;若達到了最大連接數,么就需要等待連接的釋
放,等待連接的釋放時間是由系統中預先定義好的一個超時參數(Timeout)來做判斷。如果在超時等待(Timeout)后仍沒有可用的空間連接工程序上便會返回一個null值,同時拋出無空閑連接的異常給用戶。
public
void
Timeout(int
Timeout,
Connection
con)
{
try
{
Thread
t
=
new
Threado
;
t.Start();
t.Run();
t.wait(Timeout);
closeconnection
(con)
;
t.
Destroy();
}catch
(Exception
ex)
{ex.
printstackTrace();}}
已用連接計數器的問題交由JSP
頁面中的循環來處理,每當應用程序申請一個連接時,計數器便會循環一次,部分實現代碼如下:
for
(int
=0;i<cp.GetNowconnectionso.sizeo;i++)
{
out.
println("<font
color=blue>
連接名稱”+(i+1)+”:〈/font〉”+
cp.GetNowconnections().Get(i)
+
“<br>")
;
con
=
(Connection)
cp.
GetNowconnections().Get
(0);
}
對于未用連接的處理與已用連接類似,部分實現代碼如下:
for
(int
=
cp.Getfreeconnections().size();j++)
{out.
println("<font
cOlor=blue>
未
用連接名稱”+Li+1)+”:〈/font〉”+
cp.Getfreeconnections().Get(j)
+“<br>")
;
}
連接池的調用如下圖所示,若連接已分配完畢,系統提示等待連接釋放。
4.3連接池的關閉
當應用程序退出時,通過調用closeAll()方法來關閉連接池中的連接,此時應把在連接池建立時向數據庫申請的連接對象統一歸還給數據庫(即
關閉所有數據庫連接)。
public
void
closeAllo
{
try
{
if
(rs
!=
null)
rs.
closeo
;
if
(smt
!=
null)
smt.
closeo
;
if
(psmt
!=
null)
psmt.
closeo
;
if(con
!
=
null)provider.
closeconnection
(con)
;
}
catch
(Exception
e)
{
e.
printstackTrace()
;
}}
4.4連接池的測試
對于一個好的連接池,性能顯得尤為重要。性能不僅僅體現的是對數據庫操作的處理速度還有連接池自身的穩定性。通過壓力測試,對比能夠看出DBCP連接池要比Hibernate3.0
默認自帶的數據庫連接池c3po快,但是穩定性卻不如它,并發用戶過多常常會自動斷開連接。通過對本連接池的測試發現,有連接池的時候對數據庫的操作要比沒有連接池的時候快3-5秒。一般數據庫連接池采用DBCP作為連接池時,默認的初始化為50個,速度不會有太大問題。正常情況下,系統沒問題,壓力測試從10個并發開始,每一次增量是增加10個并發,至200-400并發用戶將成為一個重要節點,性能的優越能得以體現。而本連接池沒有經過壓力測試,多用戶的并發訪問時其穩定性還有待驗證。
5系統測試問題總結
5.1連接池的泄露問題
5.1.1產生現象當系統訪問量較大時,會出現連接池連接數居高不下的情況,如果在關閉數據庫連接的過程中發生錯誤會導致他們不再會被重用。這就叫做“數據庫連接池泄漏”。這將會最終導致web應用程序數據庫連接失敗。甚至造成連接池崩潰,從而無法進行數據交互,服務器當機。
5.1.2解決辦法
常見的程序錯誤寫法有以下兩種
1.當連接執行數據庫操作出錯時,未執行數據庫關閉。
Connection
conn=Dbutil.Getconnection();
//執行數據庫操作
Dbutil.
Closeconnection();
在以上代碼中,如果執行數據庫操作過程中,出現異常,系統從出現異常處停止,不再執行下面的代碼,造成數據庫連接池無法回收,連接泄露的情況。正確的代碼寫法應如下:
Try{Connection
conn=Dbutil.Getconnection();
;//執行數據庫操作
}
catch(Excepti
on
e)
{}
finally{
Dbutil.
Closeconnection();
//異常處理后必須處理的方法。}
這樣將保證了在執行數據庫操作過程中即使出現異常,也將能夠執行
數據庫連接池的回收。
2、在連接中嵌套數據庫連接,如下TryConnection
conn=Dbutil.
Getconnection()
;
doMethodA(
)//執行數據庫操作
}
catch(Exce
ption
e)
{
}finally{
Dbutil.
Closeconnection()
;}Public
void
doMethodAo{
//再次打開數據庫進行操作
}
在上面的例子中,當調用方法doMethodA()時,在方法內部又打開了一個數據庫連接,這時造成同一線程中打開了兩個連接,如果不注意,很有可能就打開了更多的連接,以至于成為系統性能的瓶頸。
5.2多數據庫服務器問題
如今在一個應用系統中,一般可能不只訪問一個數據庫,有時會訪問兩個或是多個數據庫,各個數據庫的數據必須融會到同一個業務邏輯中,否則就成為一個個低價值的數據孤島,這時就需用到多數據源。在一個應用系統中,一般會有一數據源應用較多,其它數據源應用較少,我們把應用較多的數據源定義為主數據源,其它數據源定義為從數據源。我們為每一個數據源定義一個名稱,在應用系統中根據該名稱定向到數據源。在應用中,我們定義一個靜態Hashtable對數據源進行保存。結論
通過本次課題的研究,可以看出在廣泛采用B/S結構的Web應用程序中,并發訪問數據庫是一關鍵性問題。只有充分運用連接池訪問技術,才能提高數據庫的訪問效率,改善Web
應用,從而減少系統開銷。在進
行與數據庫有關的應用開發中,數據庫連接的管理是一個重點,也是一個難點。很多時候,連接的混亂管理所造成的系統資源開銷過大成為制約大型企業級應用效率的瓶頸。對于眾多用戶訪問的Web應用,采用數據庫連接技術的系統在效率和穩定性上比采
用傳統的其他方式的系統要好很多。
本文采用了一些廣
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 下學期二年級語文教學競賽計劃
- 2025年四川省遂寧市物理高二第二學期期末預測試題含解析
- 跨學科指導教師進修情況范文
- 小學班主任教學反思能力培訓計劃
- 湖北工業職業技術學院《藏羌文化與民俗》2023-2024學年第一學期期末試卷
- 福建對外經濟貿易職業技術學院《概車率論與數理統計》2023-2024學年第一學期期末試卷
- 江蘇省泰州市海陵區2024-2025學年八年級物理第一學期期末監測試題含解析
- 江蘇省姜堰區2025屆八年級數學第一學期期末聯考模擬試題含解析
- 河北省張家口市橋西區2024-2025學年八年級物理第一學期期末經典試題含解析
- 甘肅省慶陽市第九中學2025屆化學九上期末預測試題含解析
- 2025-2030中國轉輪除濕機行業前景動態及投資規劃分析報告
- 八年級上冊語文必背課文資料合集
- 針灸醫學的歷史回顧之古代名醫的針灸先例
- 【艾瑞咨詢】2024年中國健康管理行業研究報告494mb
- 年產xxx千件自行車配件項目可行性研究報告
- DZ/T 0261-2014滑坡崩塌泥石流災害調查規范(1∶50 000)
- T/CQAP 3014-2024研究者發起的抗腫瘤體細胞臨床研究細胞制劑制備和質量控制規范
- 初中體育教學中德育教育的現狀、問題與突破路徑探究
- 基層供銷社管理制度
- 農業供應鏈管理考試試題及答案
- 人行雨棚施工方案
評論
0/150
提交評論