2008-12-22 57 views
0

我們有一個由Oracle 10G支持的新舊應用程序組成的大型企業。當阻塞會話或死鎖發生,並且我們獲得跟蹤報告時,能夠在sql中嵌入一些細節以便我們知道哪些應用程序,特別是哪些應用程序是從哪裏執行的,將會非常方便。除了幫助加快解決時間之外,它還可以幫助我們找到業務流程彼此相關的地方。我們對如何實現這一目標有一些想法,但我很好奇這是否已經解決了問題。任何想法或任何成功(或其他)嘗試的細節將不勝感激。爲跟蹤和調試標記sql語句

回答

2

您可以標記通過Oracle DBMS_APPLICATION_INFO包執行的SQL塊。這適用於任何應用程序語言,適用於數據庫引擎本身,並且不會使用註釋混淆SQL語句(智能註釋無論如何都是邪惡的)。更重要的是,Oracle的各種工具可以識別數據並幫助您在故障排除或調整時使用它。

+0

無論如何,請鼓勵DUMB評論。 – 2008-12-23 17:06:32

0

我們動態修改我們的SQL語句,以便在查詢開始時執行它們的命令在註釋中。這是有效的,因爲我們做自己的事務管理並且有一個嚴格的框架。但是,基本代碼是簡單(在Java中...不知道如何其他語言將解決這個問題):

String sql = "SELECT * FROM USERS WHERE ID = ?"; 
Connection con = getConnection(); 
PreparedStatement ps = con.prepareStatement(getComment() + sql); 
// etc 

String getComment() { 
    return " /* " + getCommandName() + " */ "; 
} 

JDBC驅動程序通過完整傳遞註釋,它在數據庫中顯示出來時,數據庫管理員正在研究查詢。我們的命令體系結構爲此目的維護一個線程局部的命令名稱堆棧。此外,我們的連接工廠使用我們自己的連接對象封裝JDBC連接,以便即使人們針對裸機連接實例編程時也會顯示此代碼,而不是使用我們通常使用的友好輔助方法。

0
Properties jdbcProperties = new Properties(); 

this.jdbcProperties.put("user", userName); 
this.jdbcProperties.put("password", password); 
this.jdbcProperties.put("v$session.program", "YourApplicationName"); 
DriverManager.getConnection(url, jdbcProperties); 

然後靠你的連接程序欄分組檢查V $會議,就這麼簡單..

0

「我們知道,這兩個是什麼應用程序,並 具體在哪裏,它是從執行 」 你請不要提及你的應用程序的編寫內容。當你從PLSQL程序發佈SQL時,11g會提取額外的信息,根據你的環境,潛在的數據庫升級時間表和代碼變更的努力,你可能要記住這些信息。 如果從多個應用程序發出相同的SQL,它將(大部分)在v $ sql中只有一個條目,因此您可能無法將其追溯回一個應用程序。

0

我想在sql語句中嵌入註釋,以便通過tkprof(10.2.0.4)標記它們。看起來斜線星號或雙連字符的評論在某些時候被刪除。然後,我使用了假的SQL提示的語法,它通過tkprof持續存在,例如

/*+ testrun=4A */ 

數據庫忽略它,它滿足我的需求。