2011-10-24 44 views
2

我們已經有了一個運行在Websphere中的Java程序,並使用直接jdbc(不使用Hibernate或JPA)的Oracle數據庫。我們的客戶是做使用HP性能中心負載測試,和他的負荷有沒有辦法在Oracle異常上觸發jvm線程轉儲?

Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource 

下得到偶爾的甲骨文「僵局」的例外是有辦法,無論是在代碼或外部,迫使同一類線程轉儲你當你發現這個異常時得到你的jvm kill -3

回答

7

知道如何枚舉線程將不會有多大用處,如果您無法自動檢測發生異常。

我們一直這樣做。我們基本上使用:

Thread.setDefaultUncaughtExceptionHandler 

當我們的應用程序啓動,然後我們傾倒的相關信息時,發生異常情況時,我們希望:

  • Map<Thread, StackTraceElement[]> mst = Thread.getAllStackTraces();

  • Runtime.getRuntime().freeMemory()/maxMemory()/totalMemory()到獲取基本內存信息

  • 用戶使用模式如果是用戶的應用程序可以

  • 家庭自制的「分析」

  • 等互動

然後,您可以調用很多其他的事情,讓花哨。例如,我們會自動將崩潰報告(包括完整的堆棧跟蹤)發送到等待此類跟蹤的服務器。

+1

+1;我記得當我發現那些珍聞時,小燈泡發生了。 –

+0

'kill -3'以及每個線程的堆棧跟蹤都有關於每個線程已獲取和正在等待的鎖的信息。 'Thread.getAllStackTraces()'也有嗎? –

+0

@ Paul Tomblin:我不這麼認爲。我們使用* findDeadlockedThreads *方法來查找死鎖(在支持此調用的JVM上)。 –

1

對於當前線程,您可以使用Thread.dumpStack()

對於所有線程,您可以使用Thread.enumerate()來獲取所有正在運行的線程和dumpStack()中的每個線程,也可以使用Thread.getAllStackTraces()並將其打印到控制檯或任何需要的地方。

爲了在發生這些異常時發生這種情況,如果您不能在自己的代碼中執行此操作,您可以嘗試AOP,編寫代理(如果您使用的是Java 6+),或者可以在捏,抓住SQLException的源代碼,將其更改爲在其構造函數中轉儲堆棧,重新編譯並將該類放回引導類路徑中,然後再放入其他類。

相關問題