專利名稱::管理數(shù)據(jù)庫(kù)連接的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,并且特別地涉及一種管理數(shù)據(jù)庫(kù)連接的方法和系統(tǒng)。
背景技術(shù):
:如今,大量應(yīng)用(application)需要訪問(wèn)數(shù)據(jù)庫(kù)以獲得所需要的數(shù)據(jù)。例如,在使用Java語(yǔ)言開(kāi)發(fā)的與數(shù)據(jù)庫(kù)有關(guān)的應(yīng)用中,一般使用JDBC(JavaDataBaseConnection)連4妄來(lái)進(jìn)行與數(shù)據(jù)庫(kù)之間的交互。在此,連接代表了一個(gè)通道,各種使用數(shù)據(jù)的應(yīng)用可以通過(guò)這種通道對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)以完成對(duì)數(shù)據(jù)的讀寫(xiě)操作。在實(shí)際的情況中,每一次應(yīng)用請(qǐng)求都要建立一次凄t據(jù)庫(kù)連接,由于對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)很頻繁,頻繁地進(jìn)行數(shù)據(jù)庫(kù)連接操作會(huì)占用很大的內(nèi)存資源。針對(duì)這種情況,在連接的管理中引入了"連接池,,的管理模式,即預(yù)先在一個(gè)連接池中放入一定數(shù)量的連接,需要建立連接時(shí),只需從池中取出一個(gè)連接,使用完畢之后將其放回。然而,現(xiàn)有技術(shù)中的連接池管理只限于對(duì)連接的基本分配,至于應(yīng)用對(duì)連接的使用是否合理則不受控制。實(shí)際上,應(yīng)用對(duì)連接的不當(dāng)使用會(huì)導(dǎo)致資源沖突,使得線程停滯不前,甚至可能造成系統(tǒng)崩潰。對(duì)連接的不當(dāng)使用包括很多種,例如連接泄漏,即有些應(yīng)用獲取連接后沒(méi)有關(guān)閉連接,導(dǎo)致連接被持續(xù)地占用;低效地使用連接資源,即使用完某個(gè)連接后沒(méi)有立即釋^:到連接池中,或者長(zhǎng)時(shí)間地占用該連接而不使用;死鎖(deadlock),即由于以遞歸的現(xiàn)有技術(shù)已經(jīng)提出了幾種連接管理方案用于解決上述對(duì)連接使用不當(dāng)?shù)膯?wèn)題。一種技術(shù)是在應(yīng)用服務(wù)器(以下筒稱AS)中手動(dòng)檢測(cè)連接泄漏。在該方法中,利用專門(mén)的診斷程序通過(guò)輪詢的方式在AS上枱r測(cè)連接泄漏。這種檢測(cè)方法的缺點(diǎn)在于不能自動(dòng)地檢測(cè)連接泄漏,因此可能會(huì)造成漏檢,并且由于要頻繁地進(jìn)行檢測(cè),因此會(huì)帶來(lái)額外的開(kāi)銷。第二種技術(shù)是基于超時(shí)(timeout)自動(dòng)檢測(cè)連接問(wèn)題。相對(duì)于前一種檢測(cè)技術(shù)來(lái)說(shuō),這是一種自動(dòng)的方式,其中由AS管理員規(guī)定一個(gè)針對(duì)數(shù)據(jù)庫(kù)連接的超時(shí)值(例如,默認(rèn)值為75秒),在該超時(shí)屆滿之后仍然占用連接的應(yīng)用都將遭到超時(shí)異議并且因此其連接將會(huì)被系統(tǒng)收回。這種技術(shù)特別適用于死鎖的情況,因?yàn)橐坏┏霈F(xiàn)死鎖,死鎖線程中的連接資源將會(huì)因?yàn)槌瑫r(shí)被系統(tǒng)剝奪,從而解開(kāi)死鎖。但是這種技術(shù)的缺點(diǎn)在于,很難確定適合于所有事務(wù)的超時(shí)值。例如,如果線程本身是需要很長(zhǎng)時(shí)間才能完成的事務(wù),則適合于一般事務(wù)的超時(shí)會(huì)導(dǎo)致剝奪該長(zhǎng)時(shí)間事務(wù)的連接,使得長(zhǎng)時(shí)間事務(wù)無(wú)法正確進(jìn)行。而如果將超時(shí)規(guī)定得過(guò)長(zhǎng),則又使系統(tǒng)無(wú)法及時(shí)對(duì)問(wèn)題作出反應(yīng),往往在問(wèn)題出現(xiàn)之后很長(zhǎng)時(shí)間才發(fā)現(xiàn),從而使得整體的連接利用率降低。另一種常用方法是預(yù)先對(duì)程序進(jìn)行調(diào)試。其中利用程序調(diào)試工具對(duì)程序進(jìn)行分析,如果分析的結(jié)果是該程序存在當(dāng)運(yùn)行時(shí)產(chǎn)生死鎖或泄漏的可能,則通知編程人員對(duì)程序進(jìn)行修改。不言而喻,在大型企業(yè)環(huán)境中對(duì)分布式應(yīng)用進(jìn)行調(diào)試是一項(xiàng)非常繁重的任務(wù)。因此,這種方法的成本效率傘支差。針對(duì)上述的問(wèn)題,本發(fā)明的目的是提供一種管理數(shù)據(jù)庫(kù)連接的改進(jìn)的技術(shù),其能夠克服上述解決方案的缺點(diǎn),顯著地提高連接的利用率,從而在整體上提高系統(tǒng)性能。
發(fā)明內(nèi)容本發(fā)明的目的可以通過(guò)一種數(shù)據(jù)庫(kù)連接管理方法和系統(tǒng)來(lái)實(shí)現(xiàn)。該方法和系統(tǒng)通過(guò)對(duì)數(shù)據(jù)庫(kù)連接的連接上下文(connectioncontext)進(jìn)行保存和恢復(fù)以及對(duì)連接進(jìn)行重新分配,實(shí)現(xiàn)對(duì)連接的重復(fù)利用。在此所用的術(shù)語(yǔ)"連接上下文"是指一個(gè)連接的狀態(tài)信息。應(yīng)用利用連接訪問(wèn)數(shù)據(jù)庫(kù)時(shí),將在連接上傳送這種狀態(tài)信息。圖1中示出了這種狀態(tài)信息的例子,在下文中將對(duì)其進(jìn)4亍詳細(xì)地描述。在本發(fā)明的第一個(gè)方面中,提供了一種數(shù)據(jù)庫(kù)連接管理方法,包括步驟響應(yīng)于第一應(yīng)用的連接請(qǐng)求,為所述第一應(yīng)用分配可用連接;如果沒(méi)有可用連接,則選擇由第二應(yīng)用所使用的一個(gè)已用連接;對(duì)所述已用連接的連接上下文進(jìn)行備份;釋放所述已用連接;以及將所述已用連接分配給所述第一應(yīng)用。根據(jù)本發(fā)明的一個(gè)優(yōu)選實(shí)施例,如果所述第二應(yīng)用請(qǐng)求恢復(fù)先前的連接狀態(tài),則基于所述備份的連接上下文為其分配新的連接并且恢復(fù)先前的連接狀態(tài)。根據(jù)本發(fā)明的另一個(gè)優(yōu)選實(shí)施例,應(yīng)用可以是Java應(yīng)用,并且連接可以是JDBC連接。其中需要進(jìn)行備份的連接上下文包括連接的連接(Connection)對(duì)象、會(huì)話(Statement)對(duì)象、結(jié)果集(Resultset)對(duì)象。根據(jù)本發(fā)明的再一優(yōu)選實(shí)施例,在選擇已用連接時(shí),可以選擇一個(gè)占用連接超過(guò)預(yù)定時(shí)間的應(yīng)用。作為替代,也可以基于最近最少使用算法(LRU)來(lái)進(jìn)行選擇。根據(jù)本發(fā)明的又一優(yōu)選實(shí)施例,并且將所述已用連接的連接上下文與所述關(guān)鍵字之間建立對(duì)應(yīng)關(guān)系。例如,當(dāng)進(jìn)行連接上下文備份時(shí),將該應(yīng)用的連接上下文與該關(guān)鍵字一起放入一個(gè)索引表中,并且當(dāng)需要時(shí),根據(jù)該關(guān)鍵字從索引表中取出連接上下文,然后基于所述連接上下文為所述應(yīng)用分配新的連接并且恢復(fù)先前的連接狀態(tài)。其中該關(guān)鍵字可以是任意字符,也可以是任何其他能夠唯一標(biāo)識(shí)該應(yīng)用的會(huì)話的標(biāo)識(shí)符,諸如該連接上下文中的特定信息。在本發(fā)明的第二個(gè)方面中,提供了一種數(shù)據(jù)庫(kù)連接管理器,包括連接上下文備份裝置,用于對(duì)連接的上下文進(jìn)行備份;以及連接調(diào)度裝置,用于對(duì)連接進(jìn)行調(diào)度。該連接調(diào)度裝置還包括如下裝置響應(yīng)于第一應(yīng)用的連接請(qǐng)求,為所述第一應(yīng)用分配可用連接的裝置;如果沒(méi)有可用連接,則選擇由第二應(yīng)用所使用的一個(gè)已用連接的裝置;控制所述連接上下文備份裝置對(duì)所述已用連接的連接上下文進(jìn)行備份的裝置;釋放所述已用連接的裝置;以及將所述已用連接分配給所述第一應(yīng)用的裝置。在本發(fā)明的第三個(gè)方面中,提供了一種用于管理數(shù)據(jù)庫(kù)連接的管理系統(tǒng),包括應(yīng)用、連接管理器和連接池,其特征在于該連接管理器可以利用上述方法對(duì)應(yīng)用的連接上下文進(jìn)行備份和恢復(fù),并且可以對(duì)連接進(jìn)行重新調(diào)度。在現(xiàn)有技術(shù)的連接池管理方案中,應(yīng)用直接從連接池中獲取連接,并且在完成數(shù)據(jù)庫(kù)訪問(wèn)操作時(shí)釋放該連接,被釋放的連接可以供其他請(qǐng)求連接的新應(yīng)用所使用。但是如果占用連接的應(yīng)用占用了連接池中的所有連接而在完成數(shù)據(jù)庫(kù)訪問(wèn)操作后沒(méi)有及時(shí)釋放連接,就會(huì)導(dǎo)致其他請(qǐng)求連接的新應(yīng)用無(wú)法獲得連接來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。根據(jù)本發(fā)明的方法,應(yīng)用向連接管理器請(qǐng)求連接,由連接管理器根據(jù)目前的連接使用狀態(tài)對(duì)連接進(jìn)行分配。具體地說(shuō),當(dāng)連接池中的連接全部分配出去時(shí),如果有新的應(yīng)用請(qǐng)求連接,連接管理器可以在對(duì)至少一個(gè)已占用連接的應(yīng)用的連接上下文進(jìn)行可恢復(fù)性備份之后回收至少一個(gè)連接,將已回收的連接分配給提出請(qǐng)求的新應(yīng)用,從而完成對(duì)連接的重新調(diào)度。如果被釋放連接的應(yīng)用正好是不需要繼續(xù)使用該連接的應(yīng)用,則上述處理自然地結(jié)束了這種不適當(dāng)?shù)倪B接分配狀態(tài)。如果被釋放連接的應(yīng)用本身尚未完成操作,則其可以在需要時(shí)重新請(qǐng)求連接,而管理器將根據(jù)先前對(duì)其回收連接時(shí)備份的連接上下文為其恢復(fù)一個(gè)連接,從而使得該應(yīng)用的事務(wù)能夠接著中斷連接之前的處理繼續(xù)執(zhí)行,而不需要重新該事務(wù)處理。因此,本發(fā)明的方法可是實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)連接的動(dòng)態(tài)的、彈性的管理,從而提高連接資源的利用率,改善系統(tǒng)性能。參考以下結(jié)合附圖所描述的優(yōu)選實(shí)施例,本發(fā)明的這些和其他優(yōu)點(diǎn)將變得明顯。這些實(shí)施例僅用于說(shuō)明的目的,而不應(yīng)理解為對(duì)本發(fā)明的范圍的限制。圖1示意性示出了以JDBC連接為例,應(yīng)用的連接上下文的例子;圖2示意性示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的數(shù)據(jù)庫(kù)連接管理方法的流程圖;圖3示意性示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于備份數(shù)據(jù)庫(kù)連接的連接上下文的操作的流程圖;圖4示意性示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于基于所保存的連接上下文恢復(fù)數(shù)據(jù)庫(kù)連接的梯:作的流程圖;圖5示意性示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的包括數(shù)據(jù)庫(kù)連接管理器的數(shù)據(jù)庫(kù)連接管理系統(tǒng)的框圖;圖6示意性示出了才艮據(jù)本發(fā)明優(yōu)選實(shí)施例的連接管理器與Java應(yīng)用的交互過(guò)程;以及圖7示意性示出了其中可以實(shí)現(xiàn)根據(jù)本發(fā)明的實(shí)施例的計(jì)算設(shè)備。具體實(shí)施方式圖1示出了以JDBC連接為例,應(yīng)用的連接上下文的例子。在一個(gè)JDBC連接上,所傳送的信息包括配置信息、會(huì)話(Statement)和結(jié)果集(ResultSet)信息、服務(wù)器信息、數(shù)據(jù)源(DataSource)信息等。其中配置信息包括Autocommit(自動(dòng)提交)、Isolationlevel(隔離級(jí)別)、Readonly(只讀)、Catalog(目錄)和Timezone(時(shí)區(qū))等;數(shù)據(jù)源信息又包括主機(jī)/端口、用戶/密碼、數(shù)據(jù)庫(kù)等信息。具體而言,當(dāng)需要訪問(wèn)數(shù)據(jù)庫(kù),Java應(yīng)用通過(guò)請(qǐng)求建立一個(gè)連接,在所建立的連接上生成會(huì)話,在會(huì)話上執(zhí)行SQL會(huì)話,從而得到結(jié)果集。根據(jù)本發(fā)明,需要進(jìn)行備份的JDBC連接的連接上下文、即JDBC連接的狀態(tài)信息包括連接狀態(tài)、數(shù)據(jù)源狀態(tài)、事務(wù)狀態(tài)、會(huì)話狀態(tài)以及結(jié)果集狀態(tài)。以下詳細(xì)對(duì)這幾種狀態(tài)信息進(jìn)行概念性解釋或舉例說(shuō)明。連接狀態(tài)包括服務(wù)器URL、用戶/密碼、數(shù)據(jù)庫(kù)名稱等。一般而言,當(dāng)需要建立JDBC連接時(shí),首先需要下載一個(gè)驅(qū)動(dòng)(Driver),驅(qū)動(dòng)管理器調(diào)用該驅(qū)動(dòng)的連接方法并向驅(qū)動(dòng)傳遞一個(gè)URL。JDBC規(guī)范推薦的JDBCURL的^吾法格式一:l殳為jdbc:<subprotocol>:<subname>。Subprotocol定義了一個(gè)或多個(gè)驅(qū)動(dòng)所支持的數(shù)據(jù)庫(kù)連通機(jī)制的類型。Subname的內(nèi)容和語(yǔ)法依賴于subprotocol。Subname始終包括服務(wù)器地址、用戶名、密碼以及數(shù)據(jù)庫(kù)名稱。例如,針對(duì)機(jī)器dbmachine上的叫做ejbdemo的特定數(shù)據(jù)庫(kù)上的OracleSQL、et信息,則字符串url為"jdbc:oracle:thin:user/password@(description=(address_list=(address=(protocol=tcp)(host=damachine)(port=1521》)(source_route=yes)(connect—data=(sid=ejbdemo))),,。另一個(gè)例子為請(qǐng)求連接到本地機(jī)器上的ejbdemo數(shù)據(jù)庫(kù),則字符串url為"jdbc:mysql:〃localhost/ejbdemouser=user;password=pass,,0JDBC的應(yīng)用接口定義了一組屬性來(lái)標(biāo)識(shí)和描述數(shù)據(jù)源的實(shí)現(xiàn),標(biāo)準(zhǔn)數(shù)據(jù)源的特性如下表所列<table>tableseeoriginaldocumentpage9</column></row><table>事務(wù)狀態(tài)的例子包括例如,禁用自動(dòng)提交模式(假設(shè)con是連接對(duì)象)為con.setAutoCommit(false)。另夕卜,事務(wù)的隔離級(jí)別從最少限制到最多限制分別為T(mén)RANSACTION—NONETRANSACTION—READUNCOMMITTEDTRANSACTION—READCOMMITTEDTRANSACTION—REPEATABLE_READTRANSACTION一SERIALIZABLE。會(huì)話可以是諸如INSERT(插入)、UPDATE(更新)以及DELETE(刪除)之類的更新會(huì)話,也可以是使用SELECT(選擇)的查詢會(huì)話。此外,所存儲(chǔ)的程序也可以通過(guò)會(huì)話調(diào)用。諸如INSERT、UPDATE以及DELETE之類的更新會(huì)話返回表示涉及數(shù)據(jù)庫(kù)中多少行的計(jì)數(shù)。這類會(huì)話不返回任何其他信息。每一次分別向每個(gè)數(shù)據(jù)庫(kù)服務(wù)器發(fā)送一個(gè)會(huì)話。會(huì)話對(duì)象由連接對(duì)象創(chuàng)建,例如Connectionconn=dataSource.getConnection(user,passwd);Statementstmt=conn.createStatement()。從而以有效的方式對(duì)會(huì)話執(zhí)行多次,這種會(huì)話稱為準(zhǔn)備好的會(huì)話(PreparedStatement),例長(zhǎng)口Connectionconn=ds.getConnection(user,passwd);PreparedStatementps=conn.prepareStatement("INSERTINTOBOOKLIST,,+"(AUTHOR,TITLE,ISBN)VALUES(,?,),,);ps.setString(l,"Zamiatin,Evgenii,,);ps.setString(2,"We");ps.setLong(3,0140285852)。此外,可調(diào)用的會(huì)話(CallableStatement)用于執(zhí)行數(shù)據(jù)庫(kù)上已存儲(chǔ)的程序,例如CallableStatementcstmt=con.prepareCall("{CALLPROC(,"Literal_Value",)}");cstmt.setString(l,"First");cstmt.setString(2,"Third")。查詢會(huì)話返回JDBC行結(jié)果集(Rowset)。行結(jié)果集是結(jié)果集的一種。行中的各列可以通過(guò)名稱和列編號(hào)來(lái)檢索。在一個(gè)結(jié)果集中可以有任意多行。行結(jié)果集具有描述各列及其類型的元數(shù)據(jù)。JDBC規(guī)范中與結(jié)果集相關(guān)的主要概念包括行集(Rowset)類型、行集并存性(Concurrency)、結(jié)果集保留能力(Holdability)、結(jié)果集對(duì)象。其中,行集類型包括TYPE—FORWARD—ONLYTYPE—SCROLL—INSENSITIVETYPE_SCROLL—SENSITIVE;行集并存性包括CONCUR—READ_ONLYCONCUR—UPDATABLE;結(jié)果集保留能力包括ResultSetrs-stmtexecuteQuery(sqlstring)intcolldx=rs.fmdColumn("ISBN")。圖2示出了才艮據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的連接管理方法的流程圖。下面結(jié)合圖2描述給出本發(fā)明的連接管理方法。首先,一個(gè)應(yīng)用請(qǐng)求一個(gè)JDBC連接,其中該請(qǐng)求中可能帶有關(guān)鍵:字(Key)或不帶有關(guān)鍵字。如果該請(qǐng)求帶有關(guān)鍵字,則表明發(fā)出請(qǐng)求的應(yīng)用將繼續(xù)一個(gè)被中斷而未結(jié)束的會(huì)話,而該關(guān)4建字作為用于恢復(fù)一個(gè)會(huì)話的索引(下面將會(huì)進(jìn)一步詳細(xì)描述這種情況);不帶有關(guān)鍵字表明該應(yīng)用將重新開(kāi)始一個(gè)新的會(huì)話,而不是繼續(xù)一個(gè)被中斷而未結(jié)束的會(huì)話。在步驟201對(duì)JDBC連接的請(qǐng)求是不帶有關(guān)鍵字的請(qǐng)求,而在步驟210發(fā)出的對(duì)IDBC連接的請(qǐng)求是帶有關(guān)鍵字的請(qǐng)求。接著,在步驟202中,判斷連接池中是否有可用的連接。如果有可用的連接,則過(guò)程直接前進(jìn)到步驟205中為應(yīng)用分配一個(gè)連接;如果沒(méi)有空閑的連接,則過(guò)程前進(jìn)到步驟203中,選擇一個(gè)已被占用的連接進(jìn)行回收,如果所有占用的連接都在正在執(zhí)行會(huì)話,那么請(qǐng)求就會(huì)等待。如果有占用的連接空閑,則優(yōu)選地可以基于超時(shí)或采用LRU(最近最少使用算法)等現(xiàn)有技術(shù)的方法來(lái)選擇已被占用的連接。最簡(jiǎn)單的一種選擇算法是,在JDBC連接上有一個(gè)時(shí)間戳,該時(shí)間戳記錄最后一次會(huì)話執(zhí)行完成的時(shí)間;用當(dāng)前時(shí)間去減每個(gè)連接上的時(shí)間戳,選擇所得值最大的連"l妄來(lái)進(jìn)行后續(xù)的回收調(diào)度處理。在步驟204中,保存所選擇的連接上面的所有狀態(tài)信息和要被中斷的會(huì)話的關(guān)鍵字,然后將該會(huì)話掛起,接著將所選擇的連接釋放到連接池中。該關(guān)鍵字與要備份的該會(huì)話相關(guān)的狀態(tài)信息相關(guān)聯(lián)。在需要時(shí),可以用該關(guān)鍵字作為索引查找該會(huì)話的相關(guān)狀態(tài)信息,以便于恢復(fù)會(huì)話。該會(huì)話相關(guān)的狀態(tài)信息在本發(fā)明中稱為"連接上下文"。該關(guān)鍵字可以與對(duì)應(yīng)的會(huì)話的狀態(tài)信息一同保存在一個(gè)數(shù)據(jù)庫(kù)中。然后,過(guò)程前進(jìn)到步驟205,由于此時(shí)連接池中存在被釋放的空閑連接,因此可以應(yīng)用分配一個(gè)JDBC連接。在上文所描述的步驟202至步驟205為本發(fā)明的主要技術(shù)方案,至步驟205完成為一個(gè)請(qǐng)求分配JDBC連接的過(guò)程。下面根據(jù)請(qǐng)求中是否包含關(guān)鍵字信息具體分兩種情況描述。如果該請(qǐng)求中包含關(guān)鍵字則表明該請(qǐng)求需要恢復(fù)已有的被中斷的會(huì)話;如果該請(qǐng)求中沒(méi)有包含關(guān)鍵字,則表明該請(qǐng)求需要?jiǎng)?chuàng)建一個(gè)新的會(huì)話。具有步驟如下在步驟206中,檢測(cè)該請(qǐng)求中是否包含關(guān)鍵字。如果請(qǐng)求中沒(méi)有包含關(guān)鍵字,則過(guò)程進(jìn)入步驟207,其中為該會(huì)話創(chuàng)建一個(gè)關(guān)鍵字并將其綁定到會(huì)話;如果請(qǐng)求中包含了關(guān)鍵字,則過(guò)程進(jìn)入步驟208,其中根據(jù)該關(guān)鍵字檢索先前保存的連接上下文,將連接上下文中的狀態(tài)信息恢復(fù)到該連4妾上,并激活該會(huì)話。執(zhí)行步驟207和步驟208的結(jié)果都可以得到一個(gè)已經(jīng)具有關(guān)鍵字的連接,因此接下來(lái)在步驟209中,可以在激活的會(huì)話上執(zhí)行一個(gè)SQL語(yǔ)句。接著,在步驟211中,可以根據(jù)關(guān)鍵字檢測(cè)該會(huì)話是否活躍。如果判斷結(jié)果是肯定的,則在步驟212中,可以通過(guò)JDBC連接執(zhí)行SQL語(yǔ)句。然后,在步驟213中,判斷是否關(guān)閉會(huì)話。如果不關(guān)閉會(huì)話,則在過(guò)程進(jìn)行到步驟217,判斷連接是否已經(jīng)被強(qiáng)制中斷,如果為"否",則返回到步驟209中在會(huì)話上執(zhí)行SQL語(yǔ)句。如果在步驟213中關(guān)閉該會(huì)話,則接著在步驟214中判斷是否釋放連接。如果不釋放連接,則在步驟216中創(chuàng)建一個(gè)會(huì)話,并隨后進(jìn)行到步驟217,判斷連接是否被強(qiáng)制中斷。如果為"否,,,則返回到步驟209中在會(huì)話上執(zhí)行SQL語(yǔ)句。如果在步驟214釋放連接,則接著在步驟215中回收該連接,即斷開(kāi)該連接,并把該連接置于連接池中。在上述步驟217中,如果判斷連接被強(qiáng)制中斷,則進(jìn)行到步驟210,請(qǐng)求一個(gè)JDBC連接。該請(qǐng)求帶有與會(huì)話相關(guān)的關(guān)鍵字。步驟217轉(zhuǎn)到上述步驟202,以重新獲得一個(gè)新的連接,以便于根據(jù)請(qǐng)求中的關(guān)鍵字恢復(fù)先前被中斷而未結(jié)束的會(huì)話。在上述步驟中,"關(guān)鍵字,,意指可以所述應(yīng)用希望恢復(fù)的會(huì)話的連接上下文進(jìn)行索引的唯一標(biāo)識(shí)符。在具體的實(shí)現(xiàn)中,關(guān)鍵字可以是任意字符。優(yōu)選地,其也可以是連接上下文中的特定的一項(xiàng)信息或多項(xiàng)信息的組合。在此公開(kāi)的實(shí)施例不應(yīng)理解為對(duì)本發(fā)明的限制。圖3示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的用于備份數(shù)據(jù)庫(kù)連接的連接上下文的操作的流程圖。圖3中所示的步驟是圖2中的步驟204中的第一步驟的細(xì)分步驟。首先,在步驟301中,創(chuàng)建上下文對(duì)象,用上下文對(duì)象將上述連接的狀態(tài)信息打包存儲(chǔ)。其次,在步驟302中,將JDBC連接對(duì)象中的會(huì)話對(duì)象都取出來(lái)。然后,在步驟303中,將會(huì)話對(duì)象中的SQL、行集配置信息和行集都取出來(lái)放入在步驟301中創(chuàng)建的上下文對(duì)象中。最后,在步驟304中,將與該會(huì)話相關(guān)聯(lián)的關(guān)鍵字和步驟303后獲得的上下文對(duì)象一同放入索引表中以便以后可以根據(jù)關(guān)鍵字查找上下文對(duì)象并由該上下文對(duì)象恢復(fù)連接的狀態(tài)信息。恢復(fù)數(shù)據(jù)庫(kù)連接的才乘作的流程圖。圖4中所示的步驟是圖2中的步驟208的第一步驟的細(xì)分步驟。首先,在步驟401中,根據(jù)關(guān)鍵字從索引表中取出上下文對(duì)象。其次,在步驟402中,將該上下文對(duì)象中的會(huì)話對(duì)象都取出來(lái)。然后,在步驟403中,在已經(jīng)分配的JDBC連接上恢復(fù)所有狀態(tài)信息,包括恢復(fù)該會(huì)話中的信息。最后,在步驟404中,將索引表中包含該關(guān)鍵字的上下文刪除。因?yàn)樵撨B接上下文已經(jīng)恢復(fù),以后也不會(huì)被使用,為了避免與下次可能備份的該會(huì)話關(guān)鍵字相關(guān)聯(lián)的上下文相沖突,最好在將備份的上下文用于恢復(fù)后立即刪除。但是,也可以在下次備份與同一關(guān)鍵字相關(guān)的上下文時(shí),用新備份的上下文覆蓋以前備份的上下文。圖5示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的包括數(shù)據(jù)庫(kù)連接管理器的數(shù)據(jù)庫(kù)連接管理系統(tǒng)50的框圖。系統(tǒng)50包括諸如Java應(yīng)用之類的應(yīng)用51、連接池53以及根據(jù)本發(fā)明的連接管理器52。連接管理器52可以包括連接調(diào)度裝置521、連接上下文備份裝置522和連接上下文恢復(fù)裝置522。管理器52還可以包括關(guān)鍵字管理裝置523以及連接上下文保存庫(kù)524。當(dāng)連接管理器52接收到來(lái)自應(yīng)用的連接請(qǐng)求時(shí),其檢查連接池53中是否有空閑的連接。然后,如果有空閑連接,則通過(guò)連接調(diào)度裝置521為該應(yīng)用分配一個(gè)連接;如果沒(méi)有空閑連接,則通過(guò)連接調(diào)度裝置521選擇一個(gè)已占用連接的應(yīng)用。隨后連接上下文備份裝置522將所選擇應(yīng)用的連接上下文備份到連接上下文保存庫(kù)524中,掛起該連接的會(huì)話,并釋放該應(yīng)用的連接。然后,連接調(diào)度裝置521將釋放的連接分配給先前發(fā)出連接請(qǐng)求的應(yīng)用。這時(shí),關(guān)鍵字管理裝置523檢測(cè)該請(qǐng)求中是否包含關(guān)4建字。如果該連接請(qǐng)求中不含有關(guān)#:字,則為該應(yīng)用分配一個(gè)關(guān)鍵字并綁定到該會(huì)話。如果該連接請(qǐng)求中含有關(guān)鍵字,貝'J根據(jù)該關(guān)鍵字通過(guò)連接上下文恢復(fù)裝置524從連接上下文保存庫(kù)524中恢復(fù)其連接上下文,并基于該恢復(fù)的連接上下文為該應(yīng)用建立連接。圖6示出了根據(jù)本發(fā)明優(yōu)選實(shí)施例的連接管理器與Java應(yīng)用之間的交互過(guò)程,該連接管理器52包括連接調(diào)度裝置521、連接上下文備份裝置522、連接上下文恢復(fù)裝置524以及關(guān)鍵字管理裝置523(為簡(jiǎn)便起見(jiàn),在圖6中沒(méi)有詳細(xì)示出這些裝置)。在步驟61中,Java應(yīng)用向連接調(diào)度裝置發(fā)送連接請(qǐng)求GetConnection()。如果有空閑連接,則在步驟62中,連接調(diào)度裝置為Java應(yīng)用分配一個(gè)連接;如果沒(méi)有空閑連接,則連接調(diào)度裝置選擇一個(gè)已用連接,在圖中虛線所示的步驟63中,將該已用連接的連接上下文備份到上下文保存庫(kù)中,并釋放該連接。接著在步驟64中,將已釋放連接分配給該Java應(yīng)用。然后,在步驟65中,Java應(yīng)用在建立的連接上創(chuàng)建一個(gè)會(huì)話Stmt=conn.createStatement()。在步驟66中,連接管理器中的關(guān)鍵字管理裝置為該會(huì)話生成關(guān)鍵字,從而使隨后該連接上的會(huì)話都帶有該關(guān)鍵字。在步驟67中,Java應(yīng)用在所創(chuàng)建的會(huì)話上執(zhí)行帶有關(guān)鍵字的SQL語(yǔ)句,并在步驟68中,獲得返回的結(jié)果集??梢砸恢敝貜?fù)步驟67-步驟68,直到Java應(yīng)用不再需要訪問(wèn)數(shù)據(jù)庫(kù),并且在此過(guò)程中連接管理器可以隨時(shí)根據(jù)需要收回連接。利用步驟69表示這種彈性的管理。在步驟69中,當(dāng)Java應(yīng)用執(zhí)行新的SQL語(yǔ)句時(shí),通??赡苡腥N情況。第一種情況下,在步驟70中,返回結(jié)果集;第二種情況下,在短虛線所示的步驟71中,連接管理器將該連接的上下文備份到上下文保存庫(kù)中,并在步驟72中釋^:該連接;第三種情況下,連接管理器從Java應(yīng)用的會(huì)話檢索到關(guān)鍵字,并在長(zhǎng)虛線所示的步驟73和步驟74中根據(jù)該關(guān)鍵字從上下文保存庫(kù)中取出已備份的上下文,然后在步驟75中,根據(jù)該恢復(fù)的上下文為Java應(yīng)用建立連接。圖7示意性示出了可以實(shí)現(xiàn)根據(jù)本發(fā)明的實(shí)施例的計(jì)算設(shè)備。圖7中所示的計(jì)算機(jī)系統(tǒng)包括CPU(中央處理單元)701、RAM(隨機(jī)存取存儲(chǔ)器)702、ROM(只讀存儲(chǔ)器)703、系統(tǒng)總線704,硬盤(pán)控制器705、鍵盤(pán)控制器706、串行接口控制器707、并行接口控制器708、顯示器控制器709、硬盤(pán)710、鍵盤(pán)711、串行外部設(shè)備712、并行外部設(shè)備713和顯示器714。在這些部件中,與系統(tǒng)總線704相連的有CPU701、RAM702、ROM703、硬盤(pán)控制器705、4定盤(pán)控制器706,串行接口控制器707,并行接口控制器708和顯示器控制器709。硬盤(pán)710與硬盤(pán)控制器705相連,鍵盤(pán)711與鍵盤(pán)控制器706相連,串行外部設(shè)備712與串行接口控制器707相連,并行外部設(shè)備713與并行接口控制器708相連,以及顯示器714與顯示器控制器709相連。圖7中每個(gè)部件的功能在本
技術(shù)領(lǐng)域:
內(nèi)都是眾所周知的,并且圖7所示的結(jié)構(gòu)也是常規(guī)的。這種結(jié)構(gòu)不僅用于個(gè)人計(jì)算機(jī),而且用于手持設(shè)備,如PalmPC、PDA(個(gè)人數(shù)據(jù)助理)、移動(dòng)電話等等。在不同的應(yīng)用中,例如用于實(shí)現(xiàn)包含有根據(jù)本發(fā)明的客戶端模塊的用戶終端或者包含有根據(jù)本發(fā)明的網(wǎng)絡(luò)應(yīng)用服務(wù)器的服務(wù)器主機(jī)時(shí),可以向圖7中所示的結(jié)構(gòu)添加某些部件,或者圖7中的某些部件可以被省略。圖7中所示的整個(gè)系統(tǒng)由通常作為軟件存儲(chǔ)在硬盤(pán)710中、或者存儲(chǔ)在EPROM或者其它非易失性存儲(chǔ)器中的計(jì)算機(jī)可讀指令控制。軟件也可從網(wǎng)絡(luò)(圖中未示出)下載?;蛘叽鎯?chǔ)在硬盤(pán)710中,或者從網(wǎng)絡(luò)下載的軟件可被加載到RAM702中,并由CPU701執(zhí)行,以便完成由軟件確定的功能。盡管圖7中描述的計(jì)算機(jī)系統(tǒng)能夠支持根據(jù)本發(fā)明的管理數(shù)據(jù)庫(kù)連^l妻的方案,但是該計(jì)算機(jī)系統(tǒng)只是計(jì)算機(jī)系統(tǒng)的一個(gè)例子。本領(lǐng)域的熟練技術(shù)人員可以理解,許多其它計(jì)算機(jī)系統(tǒng)設(shè)計(jì)也能實(shí)現(xiàn)本發(fā)明的實(shí)施例。本發(fā)明還可以實(shí)現(xiàn)為例如由圖7所示計(jì)算機(jī)系統(tǒng)所使用的計(jì)算機(jī)程序產(chǎn)品,其可以包含有用于實(shí)現(xiàn)根據(jù)本發(fā)明的管理數(shù)據(jù)庫(kù)連接的代碼;其還可以包含有用于實(shí)現(xiàn)根據(jù)本發(fā)明的管理^t據(jù)庫(kù)連接的代碼。在使用之前,可以把代碼存儲(chǔ)在其它計(jì)算機(jī)系統(tǒng)的存儲(chǔ)器中,例如,存儲(chǔ)在硬盤(pán)或諸如光盤(pán)或軟盤(pán)的可移動(dòng)的存儲(chǔ)器中,或者經(jīng)由因特網(wǎng)或其它計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行下載。以上給出了用于實(shí)現(xiàn)本發(fā)明的各種優(yōu)選實(shí)施例,然而本領(lǐng)域的普通技術(shù)人員能夠理解,在不脫離本發(fā)明的本質(zhì)和范圍的情況下可以對(duì)本發(fā)明做出許多其他改變和改型。應(yīng)當(dāng)理解,本發(fā)明不限于在此公開(kāi)的特定實(shí)施方式,本發(fā)明的范圍由所附權(quán)利要求限定。權(quán)利要求1.一種數(shù)據(jù)庫(kù)連接管理方法,包括步驟響應(yīng)于第一應(yīng)用的連接請(qǐng)求,為所述第一應(yīng)用分配可用連接;如果沒(méi)有可用連接,則選擇由第二應(yīng)用所使用的一個(gè)已用連接;對(duì)所述已用連接的連接上下文進(jìn)行備份;釋放所述已用連接;以及將所述已用連接分配給所述第一應(yīng)用。2.根據(jù)權(quán)利要求1所述的方法,其中還包括步驟如果所述第二應(yīng)用請(qǐng)求恢復(fù)先前的連接狀態(tài),則基于所述備份的連接上下文為其分配新的連接并且恢復(fù)先前的連接狀態(tài)。3.根據(jù)權(quán)利要求1或2所述的方法,其中所述應(yīng)用是Java應(yīng)用,并且所述連接是JDBC連接。4.根據(jù)權(quán)利要求1所述的方法,其中所述選擇步驟包括如下步驟采用最近最少使用算法在所有已用連接中選擇一個(gè)將被釋放的已用連4妄;和/或選擇一個(gè)超過(guò)預(yù)定時(shí)間的已用連接。5.根據(jù)權(quán)利要求1所述的方法,其中對(duì)所述已用連接的連接上下文進(jìn)行備份的步驟還包括為進(jìn)行備份的應(yīng)用的會(huì)話定義關(guān)鍵字,并且將所述已用連接的連接上下文與所述關(guān)鍵字之間建立對(duì)應(yīng)關(guān)系。6.根據(jù)權(quán)利要求5所述的方法,其中所述關(guān)鍵字是唯一標(biāo)識(shí)每個(gè)應(yīng)用的會(huì)話的任意字符。7.根據(jù)權(quán)利要求5所述的方法,其中所述關(guān)鍵字是所述連接上下文中的特定信息。8.—種數(shù)據(jù)庫(kù)連接管理器,包括連接上下文備份裝置,用于對(duì)連接的上下文進(jìn)行備份;連接調(diào)度裝置,用于對(duì)連接進(jìn)行調(diào)度,其中還包括如下裝置響應(yīng)于第一應(yīng)用的連接請(qǐng)求,為所述第一應(yīng)用分配可用連接的裝置;如果沒(méi)有可用連接,則選擇由第二應(yīng)用所使用的一個(gè)已用連接的裝置;控制所述連接上下文備份裝置對(duì)所述已用連接的連接上下文進(jìn)行備份的裝置;釋放所述已用連接的裝置;以及將所述已用連接分配給所述第一應(yīng)用的裝置。9.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫(kù)連接管理器,其中還包括連接上下文恢復(fù)裝置,用于在所述第二應(yīng)用請(qǐng)求恢復(fù)先前的連接狀態(tài)時(shí),則基于所述備份的連接上下文為其分配新的連接并且恢復(fù)先前的連接狀態(tài)。10.根據(jù)權(quán)利要求8或9所述的數(shù)據(jù)庫(kù)連接管理器,其中所述應(yīng)用是Java應(yīng)用,并且所述連接是JDBC連接。11.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫(kù)連接管理器,其中所述選擇裝置用于執(zhí)行如下步驟采用最近最少使用算法在所有已用連接中選擇一個(gè)將被釋放的已用連接;和/或選擇一個(gè)超過(guò)預(yù)定時(shí)間的已用連接。12.根據(jù)權(quán)利要求8所述的數(shù)據(jù)庫(kù)連接管理器,其中還包括關(guān)鍵字管理裝置,用于為進(jìn)行備份的應(yīng)用的會(huì)話定義關(guān)鍵字,并且將所述已用連接的連接上下文與所述關(guān)4定字之間建立對(duì)應(yīng)關(guān)系。13.根據(jù)權(quán)利要求12所述的數(shù)據(jù)庫(kù)連接管理器,其中所述關(guān)鍵字是唯一標(biāo)識(shí)每個(gè)應(yīng)用的任意字符。14.根據(jù)權(quán)利要求12所述的數(shù)據(jù)庫(kù)連接管理器,其中所述關(guān)鍵字是所述連接上下文中的特定信息。15.—種用于對(duì)數(shù)據(jù)庫(kù)連接的管理的系統(tǒng),包括應(yīng)用和連接池,其特征在于包括根據(jù)權(quán)利要求8-14中任一項(xiàng)權(quán)利要求所述的數(shù)據(jù)庫(kù)連接管理器。全文摘要本發(fā)明提供了一種數(shù)據(jù)庫(kù)連接管理方法,包括步驟響應(yīng)于第一應(yīng)用的連接請(qǐng)求,為所述第一應(yīng)用分配可用連接;如果沒(méi)有可用連接,則選擇由第二應(yīng)用所使用的一個(gè)已用連接;對(duì)所述已用連接的連接上下文進(jìn)行備份;釋放所述已用連接;以及將所述已用連接分配給所述第一應(yīng)用。如果所述第二應(yīng)用請(qǐng)求恢復(fù)先前的連接狀態(tài),則基于所述備份的連接上下文為其分配新的連接并且恢復(fù)先前的連接狀態(tài)。由于已經(jīng)對(duì)應(yīng)用的連接上下文進(jìn)行了可恢復(fù)的備份,因此可以在需要時(shí)斷開(kāi)應(yīng)用的連接,對(duì)連接進(jìn)行重新調(diào)度,因此提高了連接利用率。本發(fā)明還提供了一種可以基于連接池技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接管理的設(shè)備和系統(tǒng)。文檔編號(hào)G06F17/30GK101334778SQ20071012687公開(kāi)日2008年12月31日申請(qǐng)日期2007年6月29日優(yōu)先權(quán)日2007年6月29日發(fā)明者影李,丞許,杰邱,瀅陳申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司