2015-09-07 56 views
6

我在也使用一些自定義JDBC代碼的現有項目中使用jOOQ。在jOOQ transaction的內部,我需要調用一些其他的JDBC代碼,並且需要通過活動連接,以便所有事物都進入同一事務。如何使用jOOQ獲取事務內部的底層連接?

我不知道如何檢索jOOQ事務中的底層連接。

create.transaction(configuration -> { 
    DSLContext ctx = DSL.using(configuration); 

    // standard jOOQ code 
    ctx.insertInto(...); 

    // now I need a Connection 
    Connection c = ctx.activeConnection(); // not real, this is what I need 
    someOtherCode(c, ...); 
}); 

閱讀文檔和偷看的源代碼我最好的選擇有點是這樣的:

configuration.connectionProvider().acquire() 

但名字有點在這種特殊情況下使用誤導。我不想要一個新的連接,只是當前的連接。我認爲這是要走的路,因爲配置是派生的,並且我將始終獲得相同的連接,但我不確定,並且在文檔中找不到答案。

回答

2

jOOQ的API不會假設存在「當前」連接。取決於您的具體實施ConnectionProvider,TransactionProvider等,這可能或不可能。

雖然您的解決方法通常很好。當你使用jOOQ的DefaultTransactionProvider,例如

Connection c = null; 
try { 
    c = configuration.connectionProvider().acquire(); 
    someOtherCode(c, ...); 
} 
finally { 
    configuration.connectionProvider().release(c); 
} 

以上是罰款:只要確保你跟隨ConnectionProvider的SPI合同。

注意有一個掛起功能要求#4552,這將允許您運行在ConnectionProvider和其通話的情況下代碼acquire()release()。這就是它的樣子:

DSL.using(configuration) 
    .connection(c -> someOtherCode(c, ...)); 
+0

感謝@LukasEder爲您的快速答案。我正在使用'DefaultTransactionProvider'。 'ConnectionProvider'是'DataSourceConnectionProvider'並且沒有'DefaultConnectionProvider'。我已經看到'ConnectionProvider.release()'方法在後者中不做任何事情,並關閉前者中的連接。 'DefaultTransactionProvider'在文檔中表示_intended使用'DefaultConnectionProvider'_。我有麻煩了嗎? ;-)似乎我可能過早地殺死了交易。 – sargue

+1

@sargue:不,你沒有麻煩。本地'Configuration'來自你自己的'Configuration'。 'DefaultTransactionProvider'在本地使用'DefaultConnectionProvider'並且保持事務範圍的'Connection'。我懷疑這值得更多文檔 –

+0

謝謝@LukasEder。對答案進行一些編輯並接受爲最佳的最新解決方案。也許交易提供者的方法會有用嗎? ''configuration.transactionProvider()。currentConnection()'它將在'NoTransactionProvider'上返回null,或者在其他更奇特的提供者上拋出一些異常,這些提供者不能支持這個。如果你認爲它可能有用,我可以在GitHub中創建一個問題。 – sargue

相關問題