




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本科畢業(yè)論文(設(shè)計(jì))論文(設(shè)計(jì))題:基于java數(shù)據(jù)庫(kù)連接池的研究學(xué)院:數(shù)學(xué)與統(tǒng)計(jì)學(xué)院專業(yè)名稱:信息與計(jì)算科學(xué)摘要在基于JDBC的數(shù)據(jù)庫(kù)實(shí)際應(yīng)用開(kāi)發(fā)中,對(duì)數(shù)據(jù)庫(kù)連接的管理是一個(gè)重點(diǎn)也是一個(gè)難點(diǎn),頻繁對(duì)數(shù)據(jù)庫(kù)的連接與關(guān)閉操作·多客戶對(duì)數(shù)據(jù)庫(kù)的并發(fā)訪問(wèn),一定程度上決定了WEB系統(tǒng)的響應(yīng)以及應(yīng)用性能。使用數(shù)據(jù)庫(kù)連接池方式能對(duì)數(shù)據(jù)庫(kù)的連接進(jìn)行管理和維護(hù),上層應(yīng)用程序通過(guò)數(shù)據(jù)庫(kù)連接池使用數(shù)據(jù)庫(kù)資源能提升系統(tǒng)性能,充分利用系統(tǒng)資源。文章通過(guò)介紹·分析數(shù)據(jù)庫(kù)連接池工作的基本原理,了解目前流行的WEB服務(wù)器在數(shù)據(jù)庫(kù)連接池方面的使用現(xiàn)狀后,總結(jié)一了些數(shù)據(jù)庫(kù)連接池開(kāi)發(fā)程序中容易忽略的問(wèn)題。并在學(xué)習(xí)掌握了實(shí)現(xiàn)連接池的關(guān)鍵技術(shù)后給出了一個(gè)較為高效的連接池管理策略在這種策略思想的指導(dǎo)下實(shí)際開(kāi)發(fā)出一個(gè)數(shù)據(jù)庫(kù)連接池模塊,使得上層應(yīng)用通過(guò)本連接池訪問(wèn)數(shù)據(jù)庫(kù)資源變得相對(duì)高效和容易,從實(shí)際上論證了這種設(shè)計(jì)方案的可行性。關(guān)鍵詞:連接池;數(shù)據(jù)庫(kù);JDBC;并發(fā)訪問(wèn)
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服務(wù)器數(shù)據(jù)庫(kù)連接池方面使用現(xiàn)狀 11.3.1DHCP介紹 21.3.2poolman介紹 21.3.3C3P0介紹 21.3.4其他連接池(自寫(xiě)連接池) 22相關(guān)理論基礎(chǔ) 32.1 數(shù)據(jù)庫(kù)概論 32.2 數(shù)據(jù)庫(kù)連接池的基本原理 32.3 連接池中的關(guān)鍵技術(shù) 42.3.1連接池的分配與釋放 42.3.2連接池的維護(hù) 53系統(tǒng)總體設(shè)計(jì)思想及方案 53.1 連接池中的關(guān)鍵類設(shè)計(jì) 63.2 連接池中的管理機(jī)制 73.3 實(shí)現(xiàn)一個(gè)連接池的其他問(wèn)題 83.3.1事務(wù)處理 83.3.2封裝 93.3.3并發(fā) 93.3.4連接池的關(guān)閉 94具體的設(shè)計(jì)流程和實(shí)現(xiàn) 104.1 連接池的建立 104.2 連接池的管理 124.3 連接池的關(guān)閉 144.4 連接池的測(cè)試 155系統(tǒng)測(cè)試問(wèn)題的總結(jié) 155.1 連接池的泄露問(wèn)題 155.1.1產(chǎn)生現(xiàn)象 155.1.2解決辦法 165.2 多數(shù)據(jù)庫(kù)服務(wù)器問(wèn)題 176總結(jié) 19參考文獻(xiàn) 20謝辭 211引言
1.1課題背景
隨著信息技術(shù)的高速發(fā)展與廣泛應(yīng)用,數(shù)據(jù)庫(kù)技術(shù)在信息技術(shù)領(lǐng)域中的位置越來(lái)越重要。傳統(tǒng)的開(kāi)發(fā)模式是:首先在主程序(如Servlet、Beans)中建立數(shù)據(jù)庫(kù)連接;然后進(jìn)行SQL操作,對(duì)數(shù)據(jù)庫(kù)中的對(duì)象進(jìn)行查詢,修改和刪除等;最后斷開(kāi)數(shù)據(jù)庫(kù)連接。使用這種開(kāi)發(fā)模式,對(duì)于一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用,由于數(shù)據(jù)庫(kù)的訪問(wèn)不是很頻繁,只需要在訪問(wèn)數(shù)據(jù)庫(kù)時(shí)創(chuàng)建一個(gè)連接,用完后就關(guān)閉它,這樣做不會(huì)明顯增大系統(tǒng)的開(kāi)銷但是對(duì)于一個(gè)復(fù)雜的數(shù)據(jù)庫(kù)應(yīng)用,情況就完全不同了,尤其是大型電子商務(wù)網(wǎng)站,同時(shí)可能有幾百人基至幾千人在線。在這種情況下,用戶操作頻繁的建立、關(guān)閉數(shù)據(jù)庫(kù),會(huì)極大的降低系統(tǒng)的性能,增大系統(tǒng)的開(kāi)銷,迫使網(wǎng)站的響應(yīng)速度下降,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。針對(duì)這些突出問(wèn)題,采用運(yùn)行速度更快,數(shù)據(jù)庫(kù)訪問(wèn)效率更高的數(shù)據(jù)庫(kù)連接池技術(shù),以提高系統(tǒng)的運(yùn)行效率將是至關(guān)重要的,因此本文提出了一種基于數(shù)據(jù)庫(kù)連接池技術(shù)的有效解決方法。以加強(qiáng)對(duì)數(shù)據(jù)庫(kù)操作的性能,改善資源使用率,提高應(yīng)用程序的響應(yīng)能力。
1.2連接池的主要作用
一個(gè)應(yīng)用系統(tǒng),同時(shí)有幾百人縣至幾千人頻繁的進(jìn)行數(shù)據(jù)庫(kù)連接操作勢(shì)必占用很多的系統(tǒng)資源,嚴(yán)重的基至?xí)斐煞?wù)器的崩潰。對(duì)于每一次數(shù)據(jù)庫(kù)連接,使用完后都得斷開(kāi)。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會(huì)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)中的內(nèi)存泄漏,最終將不得不重啟數(shù)據(jù)庫(kù)。還有,如果不能控制被創(chuàng)建的連接對(duì)象數(shù),系統(tǒng)資源會(huì)被毫無(wú)顧及的分配出去,連接過(guò)多也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。針對(duì)這些突出問(wèn)題,因此提出了一種基于數(shù)據(jù)庫(kù)連接池技術(shù)的有效解決方法。簡(jiǎn)而言之,數(shù)據(jù)庫(kù)連接池主要作用是負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不再是重新建立一個(gè);釋放空閑時(shí)間超過(guò)最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接來(lái)避免因?yàn)闆](méi)有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏。
1.3目前流行的web服務(wù)器數(shù)據(jù)庫(kù)連接池方面使用現(xiàn)狀
由于JDBC的API中沒(méi)有提供連接池的方法。一些大型的WEB應(yīng)用服務(wù)器如WebLogic、Websphere等都自帶有連接池。不同的是,tomcat并沒(méi)有自已發(fā)連接池,而是集成的apache的另外一個(gè)開(kāi)源項(xiàng)目DBCP連接池。BEA的WebLogic自身帶有一個(gè)連接池,這個(gè)連接池?zé)o法與WebLogic分離,但是也必須有其第三方的專用類方法支持連接池的用法,而不需要用戶再去寫(xiě)一個(gè)連接池。以下是一些第三方連接池:1.3.1DHCP介紹
DBCP應(yīng)Apache的Jakarta組織開(kāi)發(fā),是目前使用較為廣泛的一個(gè)連接
池,一是因?yàn)閠omcat自帶的就是這個(gè)連接池,二是因?yàn)殚_(kāi)源免費(fèi)。由于其使用的穩(wěn)定性不是很好,普名的開(kāi)源項(xiàng)目hibernate不再提供對(duì)它的支持。DBCP部分參數(shù)說(shuō)明如下:
datasource:要連接的datasource(通常我們不會(huì)定義在server.
xml)。defaultAutocommit:對(duì)于事務(wù)是否autocommit,默認(rèn)值為true。
defaultReadonly:對(duì)于數(shù)據(jù)庫(kù)是否只能讀取,默認(rèn)值為false。
driverclassName:連接數(shù)據(jù)庫(kù)所用的
JDBC
Driver
Class。maxActive:最大連接數(shù)據(jù)庫(kù)連接數(shù),設(shè)0為沒(méi)有限制。
maxldle:最大等待連接中的數(shù)量,設(shè)0為沒(méi)有限制。
maxwait:最大等待秒數(shù),單位為ms,超過(guò)時(shí)間會(huì)出錯(cuò)誤信息。
password:登陸數(shù)據(jù)庫(kù)所用的密碼。
url:連接數(shù)據(jù)庫(kù)的URL。
username:登陸數(shù)據(jù)庫(kù)所用的帳號(hào)。
validationQuery:驗(yàn)證連接是否成功,SQL
SELECT指令至少要返回一行。removeAbandoned:是否自我中斷,默認(rèn)是false。
removeAbandonedTimeout:幾秒后會(huì)自我中斷,removeAbandoned必
須為true。IogAbandoned:是否記錄中斷事件,默認(rèn)為false。
1.3.2Poolman介紹
Poolman連接池前幾年應(yīng)用較廣泛現(xiàn)在應(yīng)用相對(duì)較少。配置步驟主
要是先在/項(xiàng)日名稱/web-Inf/下加入一jar包,然后配置一個(gè)xml文件,文
件屬性類似于DBCP,最后在程序中寫(xiě)出調(diào)用該連接池的方法。
1.3.3C3PO介紹
C3PO是一個(gè)開(kāi)放源代碼的JDBC
連接池,它在lib目錄中與Hibernate一
起發(fā)布,包括了實(shí)現(xiàn)JDBC3.0和JDBC2.0擴(kuò)展規(guī)范說(shuō)明的Connection
和Statement池的Datasource對(duì)象。自從hibemate自帶了c3po以后,c3po很快就受到了廣大程序員的認(rèn)可,其性能上來(lái)說(shuō)比DBCP要好的多。1.3.4其他連接池(自寫(xiě)連接池)
有些程序員喜歡自己寫(xiě)連接池,建議不用這樣的方法,因?yàn)檫B接池的
管理較為復(fù)雜,自己寫(xiě)常出現(xiàn)各種各樣的錯(cuò)誤,推薦使用有成熟技術(shù)的連接
池,同時(shí)也方便系統(tǒng)的移植。
2相關(guān)理論基礎(chǔ)
2.1數(shù)據(jù)庫(kù)概述
數(shù)據(jù)庫(kù),顧名思義,是存人數(shù)據(jù)的倉(cāng)庫(kù)。只不過(guò)這個(gè)倉(cāng)庫(kù)是在計(jì)算機(jī)
存儲(chǔ)設(shè)備上的,而且數(shù)據(jù)是按一定格式存放的。當(dāng)人們收集了大量的數(shù)據(jù)后,應(yīng)該把它們保存起來(lái)進(jìn)入近一步的處理,進(jìn)一步的抽取有用的信息。當(dāng)年人們把數(shù)據(jù)存放在文件柜中,可現(xiàn)在隨著社會(huì)的發(fā)展,數(shù)據(jù)量急劇增長(zhǎng),現(xiàn)在人們就借助計(jì)算機(jī)和數(shù)據(jù)庫(kù)技術(shù)科學(xué)的保存大量的數(shù)據(jù),以便能更好的利用這些數(shù)據(jù)資源。要是下定義的話,就應(yīng)該是:指長(zhǎng)期儲(chǔ)存在計(jì)算機(jī)內(nèi)的,有組織的,可共享的數(shù)據(jù)集合。
數(shù)據(jù)庫(kù)包含關(guān)系數(shù)據(jù)庫(kù),面向?qū)ο髷?shù)據(jù)庫(kù)及新興的XML數(shù)據(jù)庫(kù)等多種,目前應(yīng)用最廣泛的是關(guān)系數(shù)據(jù)庫(kù),若在關(guān)系數(shù)據(jù)庫(kù)基礎(chǔ)上提供部分面向?qū)ο髷?shù)據(jù)庫(kù)功能的對(duì)象關(guān)系數(shù)據(jù)庫(kù)。在數(shù)據(jù)庫(kù)技術(shù)的早期還曾經(jīng)流行過(guò)層次數(shù)據(jù)庫(kù)與網(wǎng)狀數(shù)據(jù)庫(kù),但這兩類數(shù)據(jù)庫(kù)目前已經(jīng)極少使用。
2.2數(shù)據(jù)庫(kù)連接池的基本原理建立“緩沖存儲(chǔ)池”,是數(shù)據(jù)庫(kù)連接池的基本設(shè)計(jì)思想。這種技術(shù)類似于CPU中的Cache技術(shù),將預(yù)先設(shè)定好的數(shù)據(jù)庫(kù)連接放入該緩沖池中,當(dāng)要建立數(shù)據(jù)庫(kù)連接操作時(shí),便從池中取出一個(gè)連接,使用完畢后再將其放回。這樣就達(dá)到了連接復(fù)用的目的,應(yīng)用程序重復(fù)使用一個(gè)數(shù)據(jù)庫(kù)連接,在多層結(jié)構(gòu)的應(yīng)用程序中通過(guò)連接池技術(shù)可以使系統(tǒng)的性能明顯得到提到。最為關(guān)鍵的是,該方法避免了對(duì)數(shù)據(jù)庫(kù)連接的頻繁建立、關(guān)閉,減小了系統(tǒng)開(kāi)銷,提高了響應(yīng)速度。我們可以通過(guò)設(shè)定連接池最大連接數(shù)來(lái)防止系統(tǒng)無(wú)盡的與數(shù)據(jù)庫(kù)連接。更為重要的是我們可以通過(guò)連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫(kù)的連接的數(shù)量,使用情況,為系統(tǒng)開(kāi)發(fā),測(cè)試及性能調(diào)整提供依據(jù)。數(shù)據(jù)庫(kù)連接池屬于應(yīng)用程序?qū)Φ讓拥恼{(diào)用,用戶并發(fā)訪問(wèn)應(yīng)用程序時(shí)會(huì)提交訪問(wèn)請(qǐng)求,然后通過(guò)線程來(lái)處理這些請(qǐng)求,并向連接池申請(qǐng)一個(gè)對(duì)數(shù)據(jù)庫(kù)操作的連接,操作完畢后將連接釋放。應(yīng)用程序調(diào)用連接池
連接的基本工作原理如下圖所示:基于以上原理,連接池的建立會(huì)在后面章節(jié)中做具體描述。為了方便理解,連接池以JSP頁(yè)面形式將最大連接數(shù)的設(shè)置、連接池的使用、超時(shí)等待、連接池的關(guān)閉等情況展示出來(lái),給用戶一個(gè)更為直觀的感受。連接的調(diào)用原理如下圖所示:從圖中可以看出當(dāng)程序(JSP.
Servlet.
Java
Bean)
中需要數(shù)據(jù)庫(kù)連接時(shí),只需從內(nèi)存中取出一個(gè)來(lái),并將這個(gè)取得的連接加入Vector中,而不用新建連接;使用完畢后放回內(nèi)存中,并將Vector中的已用連接刪除。2.3連接池中的關(guān)鍵技術(shù)2.3.1連接池的分配與釋放
連接池的分配與釋放技術(shù)對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開(kāi)銷,同時(shí)還可以加快用戶的訪問(wèn)速度。對(duì)于連接的管理。每當(dāng)用戶請(qǐng)求一個(gè)連接時(shí),系統(tǒng)首先檢查連接池內(nèi)有沒(méi)有空閑連接。如果有就把建立時(shí)間最長(zhǎng)(通過(guò)容器的順序存放實(shí)現(xiàn))的個(gè)連接分配給他(實(shí)際是先做連接是否有效的判斷,如果可用就分配給用戶,若不可
用就把這個(gè)連接刪掉,重新檢測(cè)是否還有連接);如果檢查到當(dāng)前所開(kāi)連接池沒(méi)有達(dá)到連接池所允許的最大連接數(shù)(maxconn),就新建一個(gè)連接,如果已經(jīng)達(dá)到,就等待一定的時(shí)間(timeout)。如果在等待的時(shí)間內(nèi)有連接被釋放出來(lái)就可以把這個(gè)連接分配給等待的用戶,如果等待時(shí)間超過(guò)預(yù)定時(shí)間timeout,則返回空值(null)
系統(tǒng)對(duì)已經(jīng)分配出去正在使用的連接只做計(jì)數(shù)。2.3.2連接池的維護(hù)數(shù)據(jù)庫(kù)連接池到底要放置多少個(gè)連接,這是個(gè)配置策略。為了使系統(tǒng)的性能達(dá)到最佳狀態(tài),連接池中的連接數(shù)的設(shè)定顯得尤為重要,我們采用設(shè)置最大連接數(shù)(maxconn)和最小連接數(shù)(minconn)的方式來(lái)解決這一問(wèn)題。所謂最大連接數(shù),即連接池中允許連接的最大數(shù)目,然后,最大連接數(shù)的設(shè)定要通過(guò)具體的應(yīng)用需求來(lái)給出一個(gè)連接池可以承受的最大連接數(shù)目的最佳點(diǎn)。如果應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過(guò)最大連接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中,等待其他連接的釋放后再來(lái)調(diào)用一空閑連接(freeconn),這樣可能會(huì)影響部分對(duì)數(shù)據(jù)厙的操作。所謂最小連接數(shù),即應(yīng)用啟動(dòng)前,已經(jīng)預(yù)先創(chuàng)建好的連接數(shù)。無(wú)論這些數(shù)據(jù)庫(kù)連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。如果最小連接數(shù)過(guò)大,么系統(tǒng)啟動(dòng)過(guò)程將變慢,若應(yīng)用程序?qū)?shù)據(jù)庫(kù)的訪問(wèn)量不大,過(guò)多的數(shù)據(jù)庫(kù)連接資源將被浪費(fèi),但是系統(tǒng)啟動(dòng)后響應(yīng)更快;如果過(guò)小系統(tǒng)啟動(dòng)將加快,但是最初使用的用戶會(huì)因?yàn)檫B接池中沒(méi)有足夠的連接而會(huì)發(fā)送一個(gè)新的數(shù)據(jù)庫(kù)連接請(qǐng)求,將不可避免的延緩執(zhí)行速度。3
系統(tǒng)總體設(shè)計(jì)思想及方案
數(shù)據(jù)庫(kù)連接池技術(shù)的設(shè)計(jì)思想非常簡(jiǎn)單,先將數(shù)據(jù)庫(kù)連接作為對(duì)象存儲(chǔ)在一個(gè)Vector對(duì)象中,Vector類可以實(shí)現(xiàn)可增長(zhǎng)的對(duì)象“數(shù)組”。Vector
的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建Vector后進(jìn)行添加或移除項(xiàng)的操作。這里主要包含使用的連接(nowconnections)和未使用的連接(freeconnections)
兩個(gè)
Vector
類創(chuàng)
建的對(duì)象,創(chuàng)建Vector對(duì)象的方法如下:
public
DBConnectionpool(vector
connections){
freeconnections=new
Vectoro();nowconnections
=
new
Vector();
}當(dāng)外部程序向數(shù)據(jù)庫(kù)申請(qǐng)建立連接后系統(tǒng)會(huì)調(diào)用nowconnections.add()方法,此時(shí)已用連接計(jì)數(shù)器加1,相應(yīng)的,調(diào)用freeconnections.Removei()方法,此時(shí)空閑連接計(jì)數(shù)器減1,對(duì)于這樣的引用計(jì)數(shù)法將會(huì)在后面的章節(jié)中具體
描述。這樣,不同的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求就可以共享這些連接,并通過(guò)復(fù)用這些已經(jīng)建立的數(shù)據(jù)庫(kù)連接,克服傳統(tǒng)開(kāi)發(fā)模式對(duì)數(shù)據(jù)庫(kù)操作的缺點(diǎn)。另外,采用超時(shí)判斷(timeout)機(jī)制,等待應(yīng)用程序?qū)B接的釋放或者調(diào)用Connection.close()方法主動(dòng)釋放連接,能極大地節(jié)省系統(tǒng)資源和用戶等待時(shí)間。而實(shí)現(xiàn)連接池時(shí),當(dāng)應(yīng)用程序調(diào)用Connection.close()試圖去關(guān)閉數(shù)據(jù)庫(kù)連接時(shí),這時(shí)需要有一個(gè)通告給連接池實(shí)現(xiàn)模塊,通告對(duì)當(dāng)前的數(shù)據(jù)庫(kù)物理連接(DBConnectionPool
對(duì)象)進(jìn)行重用。為了使連接池實(shí)現(xiàn)模塊能得到這種“通告”,連接池實(shí)現(xiàn)模塊必須實(shí)現(xiàn)ConnectionEventListener
接口,而且同時(shí)需要注冊(cè)成為DBConnectionPool
對(duì)象的監(jiān)聽(tīng)者。連接池實(shí)現(xiàn)模塊接受到此通告后,不是真正意義上的物理獎(jiǎng)閉、而是將DBConnectionPool對(duì)象返回到池中進(jìn)行重用。從上面的介紹,可以看出連接池技術(shù)的關(guān)鍵就是其自身的管理機(jī)制,結(jié)合連接池工作
的基本原理,通過(guò)下圖展現(xiàn)出一個(gè)連接池系統(tǒng)的總體設(shè)計(jì)框架。3.1連接池中的關(guān)鍵類設(shè)計(jì)
一個(gè)連接池應(yīng)用的設(shè)計(jì),需要幾個(gè)關(guān)鍵部分作為支撐,其中最為重要
的是DBConnectionPool類和DBConnectionManager類,他們對(duì)連接的建立、管理、釋放起決定性作用。大體作用列舉如下:
1.一個(gè)DBConnectionpool類,該類負(fù)責(zé)從連接池獲取(或創(chuàng)建)連接、將連接返回給連接池、空閑連接的超時(shí)等待、系統(tǒng)關(guān)閉時(shí)釋放所有資源并關(guān)閉所有連接。
2.Datasourceproviderservlet類,該類
負(fù)責(zé)通過(guò)上下文環(huán)境讀取配置文件后裝載和注冊(cè)JDBC驅(qū)動(dòng)、數(shù)據(jù)庫(kù)名等。
3.一個(gè)DBConnection
Manager
類,該類負(fù)責(zé)按預(yù)先指定的最大連接
池?cái)?shù)連初始化連接池、創(chuàng)建DBConnectionpool對(duì)象provider.當(dāng)
所有的連接客戶退出后,關(guān)閉全部連接。4.DBperties屬性文件,該文件中包含了數(shù)據(jù)庫(kù)驅(qū)動(dòng)(DriverName)、數(shù)據(jù)庫(kù)URL、數(shù)據(jù)庫(kù)表空間名(User)、表空間密碼(Passwold)、連接池最大連接數(shù)(maxconnections)
5、即為應(yīng)用程序?qū)B接池中的連接的調(diào)用和釋放,應(yīng)用程序退出后連接池的關(guān)閉。將以上5個(gè)部分串連起來(lái),即是本連接池的簡(jiǎn)單設(shè)計(jì)流程。首先應(yīng)用程序向連接池申請(qǐng)連接,就需要通過(guò)DBConnectionpool類,DBConnectionManager類對(duì)連接池初始化并且還需要Datasourceproviderservlet類的幫助讀取DBpe西es文件中的屬性,加載和注冊(cè)JDBC驅(qū)動(dòng),數(shù)據(jù)庫(kù)名等,連接池才能初始化成功。之后通過(guò)DBConnectionPool類監(jiān)視,管理應(yīng)用程序調(diào)用,釋放的數(shù)據(jù)庫(kù)連接,并通過(guò)該類的cp對(duì)象將連接使用情況反映在頁(yè)面上。連接池管理程序得到某個(gè)連接,而其他線程就不會(huì)得到這個(gè)數(shù)據(jù)庫(kù)連接了,此線程使用結(jié)束后,該線程將連接交還給連接池管理程序,以分配給其他等待連接的請(qǐng)求
線程。這里連接池充分利用Java的線程同步機(jī)理,使當(dāng)前服務(wù)線程處于等待狀態(tài),直至有空閑的連接出現(xiàn)。最后當(dāng)應(yīng)用程序退出時(shí),通過(guò)DBConnectionManager類負(fù)責(zé)連接池的關(guān)閉。3.2連接池中的管理機(jī)制應(yīng)用程序開(kāi)發(fā)中“三分技術(shù)、七分管理”的思想在連接池的配置中同樣得以體現(xiàn),如何從連接池中取得連接,何時(shí)釋放連接、如何釋放連接等問(wèn)題還需要為連接池配置更為復(fù)雜的管理機(jī)制,連接池流程的管理如下圖所不,這些屬性定義了連接池與其中每個(gè)連接的有效狀態(tài)值。連接池的自我管理,實(shí)際上就是通過(guò)定時(shí)的對(duì)每個(gè)連接的狀態(tài)、連接的數(shù)量進(jìn)行判斷而進(jìn)行相應(yīng)操作。3.2.1事務(wù)處理前面討論的是關(guān)于使用數(shù)據(jù)庫(kù)連接進(jìn)行普通的數(shù)據(jù)庫(kù)訪問(wèn)。對(duì)于事務(wù)處理,情況就變得比較復(fù)雜。因?yàn)槭聞?wù)本身要求原則性的保證,此時(shí)就要求對(duì)于數(shù)據(jù)庫(kù)的操作符合要么全部完成,要么什么都不做。如果簡(jiǎn)單的采用上述的連接復(fù)用的策略,就會(huì)發(fā)生問(wèn)題,因?yàn)闆](méi)有辦法控制屬于同一個(gè)事務(wù)的多個(gè)數(shù)據(jù)庫(kù)操作方法的動(dòng)作,可能這些數(shù)據(jù)庫(kù)操作是在多個(gè)連接上進(jìn)行的,并且這些連接可能被其他非事務(wù)方法復(fù)用。Connectio日本身具有提供了對(duì)于事務(wù)的支持,可以通過(guò)設(shè)置Connection的Autocommit屬性為false,顯式的調(diào)用commit或roHback方法來(lái)實(shí)現(xiàn)。但是要安全、高效的進(jìn)行連接復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制。方法是:采用顯式的事務(wù)支撐方法,每一個(gè)事務(wù)獨(dú)占一個(gè)連接。這種方法可以大大降低對(duì)于事務(wù)處理的復(fù)雜性,并且又不會(huì)妨礙連接的復(fù)用。
連接管理服務(wù)提供了顯式的事務(wù)開(kāi)始結(jié)束(commit或「o11back)聲明,以及一個(gè)事務(wù)注冊(cè)表,用于登事務(wù)發(fā)起者和事務(wù)使用的連接的對(duì)應(yīng)關(guān)系,通過(guò)該表,使用事務(wù)的部分和連接管理部分就隔離開(kāi),因?yàn)樵摫硎窃谶\(yùn)行時(shí)根據(jù)實(shí)際的調(diào)用情況動(dòng)態(tài)生成的。事務(wù)使用的連接在該事務(wù)運(yùn)行中不能被復(fù)用。在實(shí)現(xiàn)中,用戶標(biāo)識(shí)是通過(guò)使用者所在的線程來(lái)標(biāo)識(shí)的。后面的所有對(duì)于數(shù)據(jù)庫(kù)的訪問(wèn)都是通過(guò)查找該注冊(cè)表,使用已經(jīng)分配的連接來(lái)完成的。當(dāng)事務(wù)結(jié)束時(shí),從注冊(cè)表中刪除相應(yīng)表項(xiàng)。3.2.2封裝
從上面的論述可以看出,普通的數(shù)據(jù)庫(kù)方法和事務(wù)方法對(duì)于連接的使用(分配,釋放)是不同的,為了便于使用,對(duì)外提供一致的操作接口對(duì)連接進(jìn)行了封裝:普通連接和事務(wù)連接,并利用了Java中的強(qiáng)大的面向?qū)ο筇匦?;多態(tài)。普通連接和事務(wù)連接均實(shí)現(xiàn)了一個(gè)DBConnection接口,對(duì)于接口中定義的方法,分別根據(jù)自己的特點(diǎn)作了不同的實(shí)現(xiàn),這樣在對(duì)于連接的處理上就非常的一致了。
3.2.3并發(fā)
為了使連接管理服務(wù)有更大的通用性,我們必須要考慮到多線程環(huán)境,即并發(fā)問(wèn)題。在一個(gè)多線程的環(huán)境下,必須要保證連接管理自身數(shù)據(jù)的一致性和連接內(nèi)部數(shù)據(jù)的一致性,(synchronized關(guān)鍵字),這樣就很容易使連接管理成為線程安全的。對(duì)于并發(fā)訪問(wèn),所有的當(dāng)前請(qǐng)求都將被連接池管理程序按順序鎖定。對(duì)請(qǐng)求線程的鎖定是通過(guò)應(yīng)用程序代碼進(jìn)行的,且請(qǐng)求數(shù)量可以很大,不必?fù)?dān)心超出緩沖容量限制。一旦將連接交還給連接池,該連接將由連接池管理程序分配給其他鎖定的請(qǐng)求。當(dāng)有很多數(shù)據(jù)庫(kù)請(qǐng)求并超出了連接池中連接的數(shù)目時(shí),只有先發(fā)出數(shù)據(jù)庫(kù)請(qǐng)求的線程獲得連接來(lái)訪問(wèn)數(shù)據(jù)庫(kù),其他連接暫時(shí)處于等待的鎖定狀態(tài),當(dāng)線程完成數(shù)據(jù)庫(kù)操作并釋放連接后,被釋放的連接將按順序由其他線程獲得,這樣就可以大大節(jié)省服務(wù)器的資源。
3.2.4連接池的關(guān)閉
很多的連接池都要求用戶通過(guò)其規(guī)定的方法獲取數(shù)據(jù)庫(kù)的連接,這一點(diǎn)我們可以理解,畢竟目前所有的應(yīng)用服務(wù)器取數(shù)據(jù)庫(kù)連接的方式都是這種方式實(shí)現(xiàn)的。但是另外一個(gè)共同的問(wèn)題是,它們同時(shí)不允許使用者顯式的調(diào)用Connection.closeo方法,而需要用其規(guī)定的一個(gè)方法來(lái)關(guān)閉連接。這種做法有兩個(gè)缺點(diǎn):
第一:改變了用戶使用習(xí)慣,增加了用戶的使用難度。使用者在用完數(shù)據(jù)庫(kù)連接后通常是直接調(diào)用連接的close方法來(lái)釋放數(shù)據(jù)庫(kù)資源。
第二:使連接池?zé)o法對(duì)之中的所有連接進(jìn)行獨(dú)占控制。由于連接池不允許用戶直接調(diào)用連接的close方法,一旦使用者在使用的過(guò)程中由于習(xí)慣問(wèn)題直接關(guān)閉了數(shù)據(jù)庫(kù)連接,么連接池將無(wú)法正常維護(hù)所有連接的狀態(tài)。
4具體的設(shè)計(jì)流程和實(shí)現(xiàn)
4.1連接池的建立應(yīng)用程序中建立的連接池其實(shí)是一個(gè)靜態(tài)的。所謂靜態(tài)連接池是指連
接池中的連接在系統(tǒng)初始化時(shí)就已分配好,且不能隨意關(guān)閉連接。Java中提了很多容器類可以方便的構(gòu)建連接池,如:Vector.Stack.Servlet.Bean等,通過(guò)讀取連接屬性文件DBperties與數(shù)據(jù)庫(kù)實(shí)例建立連接。(該屬性文件中包含了連接數(shù)據(jù)庫(kù)的URL、數(shù)據(jù)庫(kù)驅(qū)動(dòng)、數(shù)據(jù)庫(kù)表空間、數(shù)據(jù)庫(kù)表空間密碼、連接池最大連接數(shù))在系統(tǒng)初始化時(shí),根據(jù)相應(yīng)的配置創(chuàng)建連接并放置在連接池中,
這些對(duì)象作為系統(tǒng)可分配的自由連接,以后所使用的連接都是從連接池中獲得,這樣就避免了隨意建立連接,關(guān)閉連接所帶來(lái)的資源浪費(fèi)。
連接池初始化如下:
publicDBConnectionpool(vectorconnections){Freeconneetions
=
new
Vector();
nowconnections
=
new
Vector();
freeconnections=connections;
maxconnections
=freeconnections.Size()
;
}
本連接池的建立使用輸入流,通過(guò)上下文環(huán)境,讀取配置文件
(Dbconfig.Prooperties)里預(yù)先設(shè)置的參數(shù),部分代碼如下:
public
void
contextlnitialized(servletcontextEvent
event)
{Properties
Properties();
Vector
connections
=
new
Vector();
Servletcontext
context
=
event.
Getservletcontext();
try
{//使用輸入流:讀取配置文件里的各種參數(shù)
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)
;
//循環(huán)加入取得的連接到vector中for(inti=0;i<maxconnections;i++){//調(diào)用下面的方法,取得數(shù)據(jù)庫(kù)連接,并放入到Vector中connections.Add(getconnection(url,user,password,DriverName)):}}catch
(Exception
e)
{e.
printstackTrace()
;
}//放到服務(wù)器的上下文環(huán)境中context.setAttribute("CONNECTOR",new
DBConnectionpool(connections));}連接池初始化參數(shù)通過(guò)頁(yè)面設(shè)置寫(xiě)入DBpeties文件中,如下圖所示:4.2連接池的管理連接池管理策略是連接池機(jī)制的核心。當(dāng)連接池建立后,如何對(duì)連接池中的連接進(jìn)行管理,解決好連接池內(nèi)連接的分配和釋放,對(duì)系統(tǒng)的性能有很大的影響。連接的合理分配,釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開(kāi)銷,同時(shí)也加速了用戶的訪問(wèn)速度。下面介紹連接池中連接的分配,釋放策略。連接池的分配,釋放策略對(duì)于有效復(fù)用連接非常重要。就一般情況而言,當(dāng)客戶釋放數(shù)據(jù)庫(kù)連接時(shí),先判斷該連接的引用次數(shù)是否超過(guò)了規(guī)定值,如果超過(guò)就刪除該連接,并判斷當(dāng)前連接池內(nèi)總的連接數(shù)是否小于minconn(最小連接數(shù)),若小于就將連接池充滿;如果沒(méi)超過(guò)就將該連接標(biāo)記為開(kāi)放狀態(tài),可供再次復(fù)用。可以看出正是這套策略保證了數(shù)據(jù)庫(kù)連接的有效復(fù)用,避免頻繁地建立、釋放連接所帶來(lái)的系統(tǒng)資源開(kāi)銷。我們采用的方法是一個(gè)很有名的設(shè)計(jì)模式:ReferenceCounting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運(yùn)用到對(duì)于連接的分配釋放上,為每一個(gè)數(shù)據(jù)庫(kù)連接,保留一個(gè)引用記數(shù),用來(lái)記錄該連接的使用者的個(gè)數(shù)。具體的實(shí)現(xiàn)方法是:
public
synchronized
Connection
getconnection(int
Timeout)
{
Connection
con=null
;
if
(freeconnections.Size()
<=
O)
{
System.out.println(”連接失敗,由于數(shù)據(jù)庫(kù)連接池中無(wú)可用連接!請(qǐng)
等待!”);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
;
}}
當(dāng)應(yīng)用程序向數(shù)據(jù)庫(kù)發(fā)起連接請(qǐng)求時(shí),會(huì)檢查連接池中是否存在空閑
的連接。如果存在空閑的連接,連接池則把空閑連接分配給客戶,并將該連接做相應(yīng)處理,即標(biāo)記為正在使用的連接,并將引用計(jì)數(shù)加1。如果不存在空閑連接,則檢查連接池里的連接數(shù)是否已經(jīng)達(dá)到了最大連接數(shù)(maxconn),若沒(méi)有達(dá)到就為應(yīng)用程序創(chuàng)建一個(gè)新的誶榕;若達(dá)到了最大連接數(shù),么就需要等待連接的釋
放,等待連接的釋放時(shí)間是由系統(tǒng)中預(yù)先定義好的一個(gè)超時(shí)參數(shù)(Timeout)來(lái)做判斷。如果在超時(shí)等待(Timeout)后仍沒(méi)有可用的空間連接工程序上便會(huì)返回一個(gè)null值,同時(shí)拋出無(wú)空閑連接的異常給用戶。
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();}}
已用連接計(jì)數(shù)器的問(wèn)題交由JSP
頁(yè)面中的循環(huán)來(lái)處理,每當(dāng)應(yīng)用程序申請(qǐng)一個(gè)連接時(shí),計(jì)數(shù)器便會(huì)循環(huán)一次,部分實(shí)現(xiàn)代碼如下:
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);
}
對(duì)于未用連接的處理與已用連接類似,部分實(shí)現(xiàn)代碼如下:
for
(int
=
cp.Getfreeconnections().size();j++)
{out.
println("<font
cOlor=blue>
未
用連接名稱”+Li+1)+”:〈/font〉”+
cp.Getfreeconnections().Get(j)
+“<br>")
;
}
連接池的調(diào)用如下圖所示,若連接已分配完畢,系統(tǒng)提示等待連接釋放。
4.3連接池的關(guān)閉
當(dāng)應(yīng)用程序退出時(shí),通過(guò)調(diào)用closeAll()方法來(lái)關(guān)閉連接池中的連接,此時(shí)應(yīng)把在連接池建立時(shí)向數(shù)據(jù)庫(kù)申請(qǐng)的連接對(duì)象統(tǒng)一歸還給數(shù)據(jù)庫(kù)(即
關(guān)閉所有數(shù)據(jù)庫(kù)連接)。
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連接池的測(cè)試
對(duì)于一個(gè)好的連接池,性能顯得尤為重要。性能不僅僅體現(xiàn)的是對(duì)數(shù)據(jù)庫(kù)操作的處理速度還有連接池自身的穩(wěn)定性。通過(guò)壓力測(cè)試,對(duì)比能夠看出DBCP連接池要比Hibernate3.0
默認(rèn)自帶的數(shù)據(jù)庫(kù)連接池c3po快,但是穩(wěn)定性卻不如它,并發(fā)用戶過(guò)多常常會(huì)自動(dòng)斷開(kāi)連接。通過(guò)對(duì)本連接池的測(cè)試發(fā)現(xiàn),有連接池的時(shí)候?qū)?shù)據(jù)庫(kù)的操作要比沒(méi)有連接池的時(shí)候快3-5秒。一般數(shù)據(jù)庫(kù)連接池采用DBCP作為連接池時(shí),默認(rèn)的初始化為50個(gè),速度不會(huì)有太大問(wèn)題。正常情況下,系統(tǒng)沒(méi)問(wèn)題,壓力測(cè)試從10個(gè)并發(fā)開(kāi)始,每一次增量是增加10個(gè)并發(fā),至200-400并發(fā)用戶將成為一個(gè)重要節(jié)點(diǎn),性能的優(yōu)越能得以體現(xiàn)。而本連接池沒(méi)有經(jīng)過(guò)壓力測(cè)試,多用戶的并發(fā)訪問(wèn)時(shí)其穩(wěn)定性還有待驗(yàn)證。
5系統(tǒng)測(cè)試問(wèn)題總結(jié)
5.1連接池的泄露問(wèn)題
5.1.1產(chǎn)生現(xiàn)象當(dāng)系統(tǒng)訪問(wèn)量較大時(shí),會(huì)出現(xiàn)連接池連接數(shù)居高不下的情況,如果在關(guān)閉數(shù)據(jù)庫(kù)連接的過(guò)程中發(fā)生錯(cuò)誤會(huì)導(dǎo)致他們不再會(huì)被重用。這就叫做“數(shù)據(jù)庫(kù)連接池泄漏”。這將會(huì)最終導(dǎo)致web應(yīng)用程序數(shù)據(jù)庫(kù)連接失敗。甚至造成連接池崩潰,從而無(wú)法進(jìn)行數(shù)據(jù)交互,服務(wù)器當(dāng)機(jī)。
5.1.2解決辦法
常見(jiàn)的程序錯(cuò)誤寫(xiě)法有以下兩種
1.當(dāng)連接執(zhí)行數(shù)據(jù)庫(kù)操作出錯(cuò)時(shí),未執(zhí)行數(shù)據(jù)庫(kù)關(guān)閉。
Connection
conn=Dbutil.Getconnection();
//執(zhí)行數(shù)據(jù)庫(kù)操作
Dbutil.
Closeconnection();
在以上代碼中,如果執(zhí)行數(shù)據(jù)庫(kù)操作過(guò)程中,出現(xiàn)異常,系統(tǒng)從出現(xiàn)異常處停止,不再執(zhí)行下面的代碼,造成數(shù)據(jù)庫(kù)連接池?zé)o法回收,連接泄露的情況。正確的代碼寫(xiě)法應(yīng)如下:
Try{Connection
conn=Dbutil.Getconnection();
;//執(zhí)行數(shù)據(jù)庫(kù)操作
}
catch(Excepti
on
e)
{}
finally{
Dbutil.
Closeconnection();
//異常處理后必須處理的方法。}
這樣將保證了在執(zhí)行數(shù)據(jù)庫(kù)操作過(guò)程中即使出現(xiàn)異常,也將能夠執(zhí)行
數(shù)據(jù)庫(kù)連接池的回收。
2、在連接中嵌套數(shù)據(jù)庫(kù)連接,如下TryConnection
conn=Dbutil.
Getconnection()
;
doMethodA(
)//執(zhí)行數(shù)據(jù)庫(kù)操作
}
catch(Exce
ption
e)
{
}finally{
Dbutil.
Closeconnection()
;}Public
void
doMethodAo{
//再次打開(kāi)數(shù)據(jù)庫(kù)進(jìn)行操作
}
在上面的例子中,當(dāng)調(diào)用方法doMethodA()時(shí),在方法內(nèi)部又打開(kāi)了一個(gè)數(shù)據(jù)庫(kù)連接,這時(shí)造成同一線程中打開(kāi)了兩個(gè)連接,如果不注意,很有可能就打開(kāi)了更多的連接,以至于成為系統(tǒng)性能的瓶頸。
5.2多數(shù)據(jù)庫(kù)服務(wù)器問(wèn)題
如今在一個(gè)應(yīng)用系統(tǒng)中,一般可能不只訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),有時(shí)會(huì)訪問(wèn)兩個(gè)或是多個(gè)數(shù)據(jù)庫(kù),各個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)必須融會(huì)到同一個(gè)業(yè)務(wù)邏輯中,否則就成為一個(gè)個(gè)低價(jià)值的數(shù)據(jù)孤島,這時(shí)就需用到多數(shù)據(jù)源。在一個(gè)應(yīng)用系統(tǒng)中,一般會(huì)有一數(shù)據(jù)源應(yīng)用較多,其它數(shù)據(jù)源應(yīng)用較少,我們把應(yīng)用較多的數(shù)據(jù)源定義為主數(shù)據(jù)源,其它數(shù)據(jù)源定義為從數(shù)據(jù)源。我們?yōu)槊恳粋€(gè)數(shù)據(jù)源定義一個(gè)名稱,在應(yīng)用系統(tǒng)中根據(jù)該名稱定向到數(shù)據(jù)源。在應(yīng)用中,我們定義一個(gè)靜態(tài)Hashtable對(duì)數(shù)據(jù)源進(jìn)行保存。結(jié)論
通過(guò)本次課題的研究,可以看出在廣泛采用B/S結(jié)構(gòu)的Web應(yīng)用程序中,并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)是一關(guān)鍵性問(wèn)題。只有充分運(yùn)用連接池訪問(wèn)技術(shù),才能提高數(shù)據(jù)庫(kù)的訪問(wèn)效率,改善Web
應(yīng)用,從而減少系統(tǒng)開(kāi)銷。在進(jìn)
行與數(shù)據(jù)庫(kù)有關(guān)的應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)庫(kù)連接的管理是一個(gè)重點(diǎn),也是一個(gè)難點(diǎn)。很多時(shí)候,連接的混亂管理所造成的系統(tǒng)資源開(kāi)銷過(guò)大成為制約大型企業(yè)級(jí)應(yīng)用效率的瓶頸。對(duì)于眾多用戶訪問(wèn)的Web應(yīng)用,采用數(shù)據(jù)庫(kù)連接技術(shù)的系統(tǒng)在效率和穩(wěn)定性上比采
用傳統(tǒng)的其他方式的系統(tǒng)要好很多。
本文采用了一些廣
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理基礎(chǔ)理論與實(shí)踐試題及答案
- 嫻熟應(yīng)對(duì)2025年護(hù)士考試試題及答案技巧
- 臨床科研思路與試題及答案
- 主管護(hù)師考試高分秘籍與試題及答案
- 中國(guó)文化概論對(duì)社會(huì)責(zé)任意識(shí)的影響試題及答案
- 2025年行政管理考試重點(diǎn)考點(diǎn)試題及答案
- 行政管理團(tuán)隊(duì)領(lǐng)導(dǎo)力試題及答案
- 中國(guó)當(dāng)代文化問(wèn)題的管理試題及答案
- ??粕Z(yǔ)文考試試題及答案匯編
- 2025年執(zhí)業(yè)藥師備考全是干貨試題及答案
- 美發(fā)店入職合同保密協(xié)議
- 遼寧省點(diǎn)石聯(lián)考2025屆高三下學(xué)期5月聯(lián)合考試 地理 含答案
- 2025-2030年中國(guó)腫瘤醫(yī)院行業(yè)市場(chǎng)發(fā)展現(xiàn)狀分析及未來(lái)趨勢(shì)預(yù)測(cè)研究報(bào)告
- 2024年中南大學(xué)專職輔導(dǎo)員招聘筆試真題
- 2025-2030中國(guó)財(cái)務(wù)公司行業(yè)深度分析及發(fā)展前景與發(fā)展戰(zhàn)略研究報(bào)告
- 2025年人教版小學(xué)五年級(jí)下冊(cè)奧林匹克數(shù)學(xué)競(jìng)賽測(cè)試題(附參考答案)
- 不分手協(xié)議書(shū)合同書(shū)
- 室內(nèi)空間設(shè)計(jì)方案匯報(bào)
- 新生兒敗血癥診斷與治療專家共識(shí)(2024)解讀課件
- 調(diào)飲技術(shù)大賽考試題庫(kù)400題(含答案)
- 2025年山東青島東鼎產(chǎn)業(yè)發(fā)展集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
評(píng)論
0/150
提交評(píng)論