2008-10-07 15 views
4

我正在使用供應商API來獲取到應用程序數據庫的JDBC連接。該API在應用程序服務器中運行時或在獨立模式下運行時工作。我想在單個事務中運行一系列SQL語句。如果存在JTA事務,我很好地處理它們。但是,如果沒有,那麼我需要使用JDBC事務劃分方法。 (在參與JTA事務的JDBC連接上調用這些方法會導致SQLException。)如何確定JDBC連接是否從JTA啓用的DataSource或直接JDBC中檢索?

因此,我需要能夠確定Connection是來自啓用了JTA的DataSource,還是它只是一個直接的JDBC連接。

是否有直接的方法來做出這個決定?

謝謝!

回答

4

即使它是直連JDBC,也可以啓用JTA事務。檢查autoCommit標誌在這方面不起作用。您可以進行交易,分發或以其他方式,將autoCommit設置爲false。 autoCommit設置爲true會告訴你你不在分佈式事務中,但是false值就意味着你不會自動提交......它可能在任何類型的事務中。

我想你將不得不調用UserTransaction.getStatus()並驗證它不等於Status.NoTransaction()。這會告訴你,如果你在JTA交易。

-1

您可以嘗試檢查Connection的autoCommit標誌以查看它是否在事務中(不管它來自哪裏)。 (顯然,見接受的答案,這不工作也很好,我不會刪除這個答案,因爲下面依然存在:)

但我認爲你應該修改API依賴於外部交易完全。如果您仍然想要支持普通的JDBC,請將其包裝到一個單獨的API中,以便啓動事務。

更新:只需重新閱讀您的問題,並看到您未提供API,但希望使用容器管理的連接。但是,您是否仍然可以強制實施JTA(作爲應用程序需求的一部分)?如果沒有,您可以提供配置選項以回退到手動管理的事務。對於這樣一個關鍵特徵,要求正確的配置似乎是合理的(而不是試圖猜測什麼是合適的)。

+0

自動提交是一種行爲,它表示提交無論如何它並不實際進行通信,無論是XA還是事務處理等。 – 2011-02-09 08:45:53

0

thilo說的確有道理。

否則,不知道的直線方式,但我會給你一個「黑客」的方式

寫不好的SQL,你知道會給出一個DB例外。 這將導致堆棧跟蹤。從堆棧跟蹤中,您可以瞭解它是否是JTA派生的連接或NOT?