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()
但名字有點在這種特殊情況下使用誤導。我不想要一個新的連接,只是當前的連接。我認爲這是要走的路,因爲配置是派生的,並且我將始終獲得相同的連接,但我不確定,並且在文檔中找不到答案。
感謝@LukasEder爲您的快速答案。我正在使用'DefaultTransactionProvider'。 'ConnectionProvider'是'DataSourceConnectionProvider'並且沒有'DefaultConnectionProvider'。我已經看到'ConnectionProvider.release()'方法在後者中不做任何事情,並關閉前者中的連接。 'DefaultTransactionProvider'在文檔中表示_intended使用'DefaultConnectionProvider'_。我有麻煩了嗎? ;-)似乎我可能過早地殺死了交易。 – sargue
@sargue:不,你沒有麻煩。本地'Configuration'來自你自己的'Configuration'。 'DefaultTransactionProvider'在本地使用'DefaultConnectionProvider'並且保持事務範圍的'Connection'。我懷疑這值得更多文檔 –
謝謝@LukasEder。對答案進行一些編輯並接受爲最佳的最新解決方案。也許交易提供者的方法會有用嗎? ''configuration.transactionProvider()。currentConnection()'它將在'NoTransactionProvider'上返回null,或者在其他更奇特的提供者上拋出一些異常,這些提供者不能支持這個。如果你認爲它可能有用,我可以在GitHub中創建一個問題。 – sargue