2010-06-16 23 views
0

從容器中收到Websphere 7中的javax.ejb.TransactionRolledbackLocalException,我想知道如何捕獲此異常?我在Websphere中設置了超時時間,並在此時間後收到此消息。我運行會話bean。在Java中捕獲TransactionRolledbackLocalException

我想找出SQl語句是什麼原因造成這種異常。我在哪裏可以找到?

回答

1

As per Sun's docs 這裏的底線準則:如果客戶可以合理預期從異常中恢復,使它成爲一個檢查異常。如果客戶端無法做任何事情來恢復異常,請將其設爲未檢查的異常。

​​是一個未經檢查的異常,如果發生這種情況,您就無能爲力。你可以在Aaron Digulla的回答中提到它,但這有什麼意義呢?

如果你抓住它,那麼你會弄亂App Server的內部。你會在客戶端得到一個異常,你可以調用getCause()來處理你在客戶端得到的異常,以便正確地通知用戶。

有兩種解決方法

  1. 看看是什麼原因造成的超時 (可能是壞的SQL)
  2. 增加超時
+0

原因是我想找到什麼SQL導致超時,我無法找到它。異常對象不包含我知道的錯誤SQL。 – user271858 2010-06-17 11:55:05

+0

@ user271858如果你看堆棧跟蹤是否存在?如果它是通過遍歷異常鏈獲得的。你可以在你的代碼中做到這一點(看這裏http://java.sun.com/docs/books/tutorial/essential/exceptions/chained.html) – 2010-06-17 13:19:45

+0

不,這不是Í恐怕。 – user271858 2010-06-17 13:27:07

1

事務回滾當兩個條件之一:

  1. 。在你的代碼的異常
  2. 有超時

很明顯,你可以捕獲該異常在情況#1通過用try{}catch()包裝最外面的代碼。但是你的哪些代碼在超時時執行?

除非您的應用程序服務器提供了API來將偵聽器附加到此類事件,否則這是不可能的。請參閱隨產品一起收到的文檔或致電支持以獲取詳細信息。

[編輯]如果你想看到這實際上導致超時的SQL,你有兩個選擇:

  1. 您可以使用java.sql.DriverManager.setLogWriter(w);記錄所有SQL語句到文件中。雖然這總是有效,但它會創建大量輸出,除非您能確保您是唯一正在運行的請求,否則很難將其與此異常相匹配。

  2. 如果您使用OR映射器(如Hibernate等),您可以爲它們啓用日誌記錄。請參閱here for Hibernate

+0

您是否聽說過這樣的API? – user271858 2010-06-17 11:53:56

+0

不,但這並不意味着它不存在。正如我所說:檢查文檔。 – 2010-06-21 07:04:38

0

您還可以使用[Log4JDBC(https://code.google.com/p/log4jdbc/) 。 這允許在驅動程序前登錄。

它的工作方式是,您可以像代理一樣在數據源中指定它。

當然,如果您使用休眠,則更簡單的方法是設置show sql屬性。 但是,如果你使用JDBC,這將工作,因爲所有的查詢都經過這裏。