專(zhuān)利名稱(chēng):對(duì)java操作數(shù)據(jù)庫(kù)的監(jiān)控系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
一種涉及數(shù)據(jù)庫(kù)操作的系統(tǒng),具體為一種數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng)。
現(xiàn)有技術(shù)基于數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用十分廣泛,各種工商業(yè)和科研單位都需要穩(wěn)定安全的數(shù)據(jù)庫(kù)作系統(tǒng)為支撐。例如一般商業(yè)公司的數(shù)據(jù)庫(kù)系統(tǒng)主要用于為用戶(hù)提供客戶(hù)信息,數(shù)據(jù)庫(kù)中的數(shù)據(jù)包括客戶(hù)的個(gè)人信息、客戶(hù)通過(guò)各種途徑訂購(gòu)和使用公司業(yè)務(wù)的數(shù)據(jù)??头藛T為用戶(hù)提供語(yǔ)音咨詢(xún)服務(wù)時(shí),需要快速查詢(xún)客戶(hù)信息,以及客戶(hù)訂購(gòu)和使用業(yè)務(wù)的情況,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的調(diào)用極為頻繁,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的穩(wěn)定性有著極高的要求。在此情況下,數(shù)據(jù)庫(kù)連接池作為一個(gè)存放了一定數(shù)量的與數(shù)據(jù)庫(kù)服務(wù)器的物理連接的容器,一旦未釋放連接將會(huì)導(dǎo)致數(shù)據(jù)庫(kù)連接池滿而無(wú)法提供可用連接,使得應(yīng)用程序操作數(shù)據(jù)庫(kù)失敗,嚴(yán)重影響系統(tǒng)穩(wěn)定性。查找未釋放連接的代碼目前還沒(méi)有簡(jiǎn)單、有效的解決辦法,通常需要查找所有使用數(shù)據(jù)庫(kù)連接的代碼程序,這種方法不僅非常耗時(shí),而且不容易找出具體的有問(wèn)題的代碼。執(zhí)行一個(gè)差的SQL語(yǔ)句有時(shí)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)的堵塞甚至崩潰,如果要找出這條SQL語(yǔ)句非常難,需要由專(zhuān)項(xiàng)通過(guò)數(shù)據(jù)庫(kù)工具可以找出來(lái),普通程序員要解決這個(gè)問(wèn)題往往束手無(wú)策。同時(shí)目前還沒(méi)有好的攔截和記錄應(yīng)用程序執(zhí)行的所有SQL語(yǔ)句的方法。
發(fā)明內(nèi)容
為了解決上述技術(shù)問(wèn)題,本發(fā)明所提供一種可以對(duì)java操作數(shù)據(jù)庫(kù)的行為進(jìn)行監(jiān)控的系統(tǒng)。本發(fā)明所提出的一種數(shù)據(jù)監(jiān)控系統(tǒng),包數(shù)據(jù)庫(kù)計(jì)算機(jī)組,監(jiān)控計(jì)算機(jī)組,數(shù)據(jù)庫(kù)計(jì)算機(jī)組和監(jiān)控計(jì)算機(jī)組通過(guò)網(wǎng)絡(luò)連接,數(shù)據(jù)庫(kù)計(jì)算機(jī)組包括一臺(tái)以上的計(jì)算機(jī)。其中,所述數(shù)據(jù)庫(kù)計(jì)算機(jī)運(yùn)行一數(shù)據(jù)庫(kù),所述數(shù)據(jù)庫(kù)包括一連接池,監(jiān)控計(jì)算機(jī)組I使用JAVA的JDBC接口,通過(guò)JAVA的代理模式對(duì)DataSource進(jìn)行代理,獲得DataSourceProxy,調(diào)用 DataSourceProxy 的 getConnection 方法獲得 ConnectionProxy,在 getConnection 過(guò)程中,DataSourceProxy 將真實(shí)的 Connection 注入 ConnectionProxy,并通過(guò)Monitor類(lèi)記錄獲取連接的時(shí)間,Connection和當(dāng)前線程堆棧;通過(guò)java的代理模式對(duì) Connection, Statement 和 PreparedStatement 進(jìn)行代理,獲得 ConnectionProxy,StatementProxy 和 PreparedStatementProxy,攔截 ConnectionProxy, StatementProxy 和PreparedStatementProxy中的SQL語(yǔ)句,將SQL語(yǔ)句記錄到日志或Monitor類(lèi)的一個(gè)靜態(tài)屬性中在執(zhí)行SQL語(yǔ)句前記錄執(zhí)行開(kāi)始時(shí)間,在SQL語(yǔ)句執(zhí)行結(jié)束后,清除Monitor類(lèi)靜態(tài)屬性中的SQL語(yǔ)句和執(zhí)行開(kāi)始時(shí)間,比較執(zhí)行開(kāi)始時(shí)間與執(zhí)行結(jié)束時(shí)間即可得出執(zhí)行時(shí)間,并記錄到日志文件。其中,監(jiān)控計(jì)算機(jī)組用于查看Monitor類(lèi)的靜態(tài)屬性,查看到數(shù)據(jù)庫(kù)連接的使用情況,使用數(shù)據(jù)庫(kù)連接的方法,占用數(shù)據(jù)庫(kù)連接的時(shí)間。
其中,監(jiān)控計(jì)算機(jī)組用于查看Monitor類(lèi)的靜態(tài)屬性,定位未釋放連接的代碼,釋放連接。其中,監(jiān)控計(jì)算機(jī)組用于查看Monitor類(lèi)的靜態(tài)屬性,確定數(shù)據(jù)庫(kù)正在執(zhí)行的SQL語(yǔ)句,SQL語(yǔ)句經(jīng)執(zhí)行時(shí)間。本發(fā)明通過(guò)設(shè)置監(jiān)控計(jì)算組對(duì)數(shù)據(jù)庫(kù)計(jì)算機(jī)組的運(yùn)行的數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控,特別是監(jiān)控java對(duì)數(shù)據(jù)庫(kù)的操作行為,使得普通程序員可以及時(shí)發(fā)現(xiàn)問(wèn)題,例如一個(gè)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)的堵塞的SQL語(yǔ)句,或未釋放數(shù)據(jù)庫(kù)連接。進(jìn)而使得數(shù)據(jù)庫(kù)穩(wěn)定性提高,減少了運(yùn)行數(shù)據(jù)庫(kù)的計(jì)算機(jī)組為了處理數(shù)據(jù)庫(kù)堵塞或奔潰的峰值運(yùn)算時(shí)間及運(yùn)行數(shù)據(jù)庫(kù)的計(jì)算機(jī)組的處理器的負(fù)載。
圖1為對(duì)java操作數(shù)據(jù)庫(kù)的監(jiān)控系統(tǒng)的示意圖。圖例說(shuō)明1.數(shù)據(jù)庫(kù)計(jì)算機(jī)組2.監(jiān)控計(jì)算機(jī)組
具體實(shí)施例方式在本發(fā)明設(shè)計(jì)的一項(xiàng)優(yōu)選例中,如附圖1所示運(yùn)行數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)計(jì)算機(jī)組1、監(jiān)控計(jì)算機(jī)組2,監(jiān)控計(jì)算機(jī)組2通過(guò)局域網(wǎng)與數(shù)據(jù)庫(kù)計(jì)算機(jī)組I連接。在監(jiān)控計(jì)算機(jī)組2 端,安裝 java 客戶(hù)端,對(duì) DataSource, Connection, Statement和PreparedStatement的代理,在代理方法里實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)連接的監(jiān)控,SQL語(yǔ)句執(zhí)行時(shí)間的監(jiān)控和SQL語(yǔ)句的攔截,編輯和記錄。通過(guò)對(duì)DataSource和Connection的代理實(shí)現(xiàn)。應(yīng)用程序通過(guò)調(diào)用DataSourceProxy的getConnection方法獲得ConnectionProxy,在 getConnection 方法里,DataSourceProxy 會(huì)將真實(shí)的 Connection 注入ConnectionProxy,并通過(guò)Monitor類(lèi)記錄獲取連接的時(shí)間,Connection和當(dāng)前線程的堆棧,通過(guò)對(duì)堆棧的分析還可以只記錄某些包下的某些類(lèi)及類(lèi)下的某些方法。當(dāng)應(yīng)用程序調(diào)用ConnectionProxy的close方法釋放連接時(shí),ConnectionProxy先調(diào)用所代理的Connection的close方法,釋放連接,然后清除Monitor類(lèi)中當(dāng)前線程獲取連接的時(shí)間,Connection和堆棧記錄。當(dāng)數(shù)據(jù)庫(kù)連接池滿了時(shí),只需檢查未清除記錄的堆棧信息,即可知道未釋放連接的代碼的大致位置。SQL語(yǔ)句執(zhí)行時(shí)間的監(jiān)控和SQL語(yǔ)句的攔截,編輯和記錄。通過(guò)對(duì)Connection, Statement 和 PreparedStatement 的代理,在所有帶有 sql參數(shù)的方法里實(shí)現(xiàn)代理方法,即可攔截得到SQL語(yǔ)句,此時(shí)可以將SQL語(yǔ)句記錄到日志或Monitor類(lèi)的一個(gè)靜態(tài)屬性中,或者編輯SQL語(yǔ)句,再將編輯后的SQL語(yǔ)句作為真正執(zhí)行的SQL語(yǔ)句。在執(zhí)行SQL語(yǔ)句前記錄執(zhí)行開(kāi)始時(shí)間,在SQL語(yǔ)句執(zhí)行后,清除Monitor類(lèi)靜態(tài)屬性中的SQL語(yǔ)句和執(zhí)行時(shí)間,比較開(kāi)始時(shí)間即可得出執(zhí)行時(shí)間,并記錄到日志文件,在釋放連接時(shí)清除SQL語(yǔ)句和執(zhí)行時(shí)間。當(dāng)數(shù)據(jù)庫(kù)堵塞時(shí),檢查未清除的SQL語(yǔ)句,即可知道哪些SQL語(yǔ)句可能導(dǎo)致數(shù)據(jù)庫(kù)堵塞。使用本發(fā)明提供的方案后,通過(guò)監(jiān)控計(jì)算機(jī)組I監(jiān)控系統(tǒng)對(duì)數(shù)據(jù)庫(kù)訪問(wèn),提供的監(jiān)控功能包括
顯示數(shù)據(jù)庫(kù)計(jì)算機(jī)組I正在使用的數(shù)據(jù)庫(kù)連接數(shù)和空閑連接數(shù)。顯示數(shù)據(jù)庫(kù)計(jì)算機(jī)組I正在執(zhí)行的sql語(yǔ)句、執(zhí)行的時(shí)間點(diǎn)、執(zhí)行了多長(zhǎng)時(shí)間、以及執(zhí)行sql的應(yīng)用系統(tǒng)賬號(hào)。顯示數(shù)據(jù)庫(kù)計(jì)算機(jī)組I正在使用數(shù)據(jù)庫(kù)連接的代碼堆棧信息和獲取數(shù)據(jù)庫(kù)連接的時(shí)間。該系統(tǒng)上線一段時(shí)間后運(yùn)行穩(wěn)定高效,在測(cè)試和正式上線初期,因?yàn)槭褂帽景l(fā)明提供的數(shù)據(jù)庫(kù)操作監(jiān)控方案,迅速解決了所有未釋放數(shù)據(jù)庫(kù)連接導(dǎo)致系統(tǒng)不穩(wěn)定的問(wèn)題,同時(shí)因?yàn)槟鼙O(jiān)控sql語(yǔ)句的執(zhí)行時(shí)間,為優(yōu)化系統(tǒng)提供有力的幫助,大大提高了系統(tǒng)的性倉(cāng)泛。以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種數(shù)據(jù)監(jiān)控系統(tǒng),包括數(shù)據(jù)庫(kù),監(jiān)控計(jì)算機(jī)組,所述數(shù)據(jù)庫(kù)計(jì)算機(jī)組和所述監(jiān)控計(jì)算機(jī)組通過(guò)網(wǎng)絡(luò)連接,所述數(shù)據(jù)庫(kù)計(jì)算機(jī)組包括一臺(tái)以上的計(jì)算機(jī),其特征在于所述數(shù)據(jù)庫(kù)計(jì)算機(jī)運(yùn)行一數(shù)據(jù)庫(kù),所述數(shù)據(jù)庫(kù)包括一連接池,監(jiān)控計(jì)算機(jī)組使用JAVA的 JDBC接口,通過(guò)JAVA的代理模式對(duì)DataSource進(jìn)行代理,獲得DataSourceProxy,調(diào)用 DataSourceProxy 的 getConnection 方法獲得 ConnectionProxy,在 getConnection 過(guò)程中,DataSourceProxy 將真實(shí)的 Connection 注入 ConnectionProxy,并通過(guò) Monitor類(lèi)記錄獲取連接的時(shí)間,Connection和當(dāng)前線程堆棧;通過(guò)java的代理模式對(duì) Connection, Statement 和 PreparedStatement 進(jìn)行代理,獲得 ConnectionProxy, StatementProxy 和 PreparedStatementProxy,攔截 ConnectionProxy, StatementProxy 和 PreparedStatementProxy中的SQL語(yǔ)句,將SQL語(yǔ)句記錄到日志或Monitor類(lèi)的一個(gè)靜態(tài)屬性中在執(zhí)行SQL語(yǔ)句前記錄執(zhí)行開(kāi)始時(shí)間,在SQL語(yǔ)句執(zhí)行結(jié)束后,清除Monitor類(lèi)靜態(tài)屬性中的SQL語(yǔ)句和執(zhí)行開(kāi)始時(shí)間,比較執(zhí)行開(kāi)始時(shí)間與執(zhí)行結(jié)束時(shí)間即可得出執(zhí)行時(shí)間,并記錄到日志文件。
2.根據(jù)權(quán)利要求1所述的一種數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng),其特征在于所述監(jiān)控計(jì)算機(jī)組用于查看Monitor類(lèi)的靜態(tài)屬性,查看到數(shù)據(jù)庫(kù)連接的使用情況,使用數(shù)據(jù)庫(kù)連接的方法,占用數(shù)據(jù)庫(kù)連接的時(shí)間。
3.根據(jù)權(quán)利要求1所述的一種數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng),其特征在于所述監(jiān)控計(jì)算機(jī)組用于查看Monitor類(lèi)的靜態(tài)屬性,定位未釋放連接的代碼,釋放連接。
4.根據(jù)權(quán)利要求1所述的一種數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng),其特征在于所述監(jiān)控計(jì)算機(jī)組用于查看Monitor類(lèi)的靜態(tài)屬性,確定數(shù)據(jù)庫(kù)正在執(zhí)行的SQL語(yǔ)句,SQL語(yǔ)句經(jīng)執(zhí)行時(shí)間。
全文摘要
一種數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng),包數(shù)據(jù)庫(kù)計(jì)算機(jī)組1,監(jiān)控計(jì)算機(jī)組2,數(shù)據(jù)庫(kù)計(jì)算機(jī)組1和監(jiān)控計(jì)算機(jī)組2通過(guò)網(wǎng)絡(luò)連接。其中所述數(shù)據(jù)庫(kù)計(jì)算機(jī)組1運(yùn)行一數(shù)據(jù)庫(kù),所述數(shù)據(jù)庫(kù)包括一連接池,監(jiān)控計(jì)算機(jī)組2使用JAVA數(shù)據(jù)庫(kù)連接JDBC接口通過(guò)getConnection獲得ConnectionProxy,在getConnection過(guò)程中,DataSourceProxy將真實(shí)的Connection注入ConnectionProxy,并通過(guò)Monitor類(lèi)記錄獲取連接的時(shí)間,Connection和當(dāng)前線程堆棧。通過(guò)設(shè)置監(jiān)控計(jì)算組對(duì)數(shù)據(jù)庫(kù)計(jì)算機(jī)組的運(yùn)行的數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控,使得普通程序員可以及時(shí)發(fā)現(xiàn)問(wèn)題,例如一個(gè)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)的堵塞的SQL語(yǔ)句,或未釋放數(shù)據(jù)庫(kù)連接。進(jìn)而使得數(shù)據(jù)庫(kù)穩(wěn)定性提高,減少了運(yùn)行數(shù)據(jù)庫(kù)的計(jì)算機(jī)組為了處理數(shù)據(jù)庫(kù)堵塞或奔潰的峰值運(yùn)算時(shí)間及運(yùn)行數(shù)據(jù)庫(kù)的計(jì)算機(jī)組的處理器的負(fù)載。
文檔編號(hào)G06F11/34GK103034679SQ20121045634
公開(kāi)日2013年4月10日 申請(qǐng)日期2012年11月14日 優(yōu)先權(quán)日2012年11月14日
發(fā)明者曾應(yīng)玉 申請(qǐng)人:上海百事通信息技術(shù)有限公司