2015-09-07 14 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は、「現在の」接続の存在については何も想定していません。 ConnectionProviderTransactionProviderなどの具体的な実装に応じて、これは可能かもしれないし、そうでないかもしれません。

あなたの回避策は一般的に問題ありません。ちょうどあなたがConnectionProviderのSPI契約に従っていることを確認します上記

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

結構ですが、あなたは、例えば、jOOQのDefaultTransactionProviderを使用しているとき。

注あなたはacquire()release()ConnectionProviderとその呼び出しのコンテキストでコードを実行できるようになります保留機能要求#4552があります。これは、次のようになります。

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

おかげさまで、@LukasEderはあなたの迅速な答えです。私は 'DefaultTransactionProvider'を使用しています。 'ConnectionProvider'は' DataSourceConnectionProvider'であり、 'DefaultConnectionProvider'はありません。私は 'ConnectionProvider.release()'メソッドは後者では何もしないで、前者では接続を閉じていることがわかりました。 'DefaultTransactionProvider'は、' DefaultConnectionProvider'_で動作することが意図されていたドキュメントを示しています。私は困っていますか? ;-)私はトランザクションをあまりにも早く殺したかもしれないと思われる。 – sargue

+1

@sargue:いいえ、あなたは困っていません。ローカルの 'Configuration'は自分自身の' Configuration'から得られます。 'DefaultTransactionProvider'はローカルで' DefaultConnectionProvider'を使い、 'Connection'をトランザクションのスコープとして保持します。私はこれがより多くのドキュメントにふさわしいと思う。 –

+0

ありがとう@LukasEder。答えを編集して、現在の最良の解決策として受け入れます。おそらくトランザクションプロバイダのメソッドが役に立ちますか? 'configuration.transactionProvider()。currentConnection()'は 'NoTransactionProvider'でnullを返します。これをサポートできない他のよりエキゾチックなプロバイダに対しては例外をスローします。私はGitHubで役に立つかもしれないと思うなら問題を作り出すことができます。 – sargue

関連する問題