2010-10-05 43 views
2

我在EJB中使用了一些遺留的JDBC代碼,在此代碼中調用setAutocommit()(由於可以理解的原因,這對於託管事務是不允許的)。有沒有辦法確定連接管理?

如果代碼在託管事務中使用,那麼我想跳過此方法調用,但是如果在未託管的上下文中使用代碼,請保留此調用。

是否有一種標準方法來檢測JDBC連接對象是否被「管理」?

回答

2

有點像樣的交易經理setAutoCommit(false)setTransactionIsolation(Connection.TRANSACTION_XXX)

根據所使用的JDBC驅動程序和事務管理器的不同,您可能會對getAutoCommit()和/或getTransactionIsolation()有一些好運。通過測試確定在兩種情況下都使用了哪些值,以便您可以瞭解如何區分其他值。

+0

很好的建議!儘管我最終決定完全跳過setAutoCommit,因爲我意識到我現在的代碼實際上只是在容器中使用,並且希望儘快完全棄用,但是您的建議似乎是我需要的一個好解決方案去做吧。 – Brummo 2010-10-07 19:12:13

0

對於我來說,檢查自動提交和事務隔離是不夠的,因爲他們(分別爲falseConnection.TRANSACTION_READ_COMMITTED)設置爲相同的值,既當連接是由Hibernate的直接(獨立),並提供內部運行時, JEE容器(託管交易)。

因爲我沒有發現任何其他屬性,我最終使用了下面的代碼,它檢查連接的類型是org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7(或類似的)。

if (!conn.getAutoCommit()) { 
    if (!conn.getClass().getName().startsWith("org.jboss.jca.")) { 
     conn.commit(); 
    } 
} 

我對此解決方案不滿意,所以如果有人有更好的主意,請告訴我!

相關問題