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