2015-09-07 4 views
6

Ich verwende jOOQ in einem bestehenden Projekt, das auch einige benutzerdefinierte JDBC-Code verwendet. Innerhalb eines jOOQ transaction muss ich irgendeinen anderen JDBC Code anrufen und ich muss die aktive Verbindung durchlaufen, also kommt alles in die gleiche Transaktion.Wie bekomme ich die zugrunde liegende Verbindung innerhalb einer Transaktion mit Hilfe von jOOQ?

Ich weiß nicht, wie Sie die zugrunde liegende Verbindung innerhalb einer JOOQ-Transaktion abrufen.

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, ...); 
}); 

die Dokumentation lesen und ein bisschen auf den Quellcode meine beste Wette späht, ist dies:

configuration.connectionProvider().acquire() 

Aber der Name ist ein wenig in diesem speziellen Anwendungsfall irreführend. Ich möchte keine neue Verbindung, nur die aktuelle. Ich denke, das ist der Weg zu gehen, weil die Konfiguration abgeleitet ist und ich immer die gleiche Verbindung bekomme, aber ich bin mir nicht sicher und ich kann die Antwort nicht in der Dokumentation finden.

Antwort

2

Die API von jOOQ macht keine Annahmen über das Vorhandensein einer "aktuellen" Verbindung. Abhängig von Ihren konkreten Implementierungen von ConnectionProvider, TransactionProvider usw. ist dies möglich oder nicht möglich.

Ihre Problemumgehung ist in der Regel in Ordnung. So stellen Sie sicher, dass Sie die ConnectionProvider ‚s SPI Vertrag folgen:

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

Die oben in Ordnung ist, wenn Sie verwenden jOOQ der DefaultTransactionProvider, zum Beispiel.

Hinweis es ein anhängiges Feature-Request #4552, die Sie Code im Kontext eines ConnectionProvider und seine Anrufe acquire() und release() laufen können. So wird es aussehen:

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

Dank @LukasEder für Ihre schnelle Antwort. Ich benutze 'DefaultTransactionProvider'. Der 'ConnectionProvider' ist' DataSourceConnectionProvider' und kein 'DefaultConnectionProvider'. Ich habe gesehen, dass die 'ConnectionProvider.release()' Methode nichts in letzterem tut und die Verbindung im ersteren schließt. Der 'DefaultTransactionProvider' sagt in den Dokumenten, dass _ mit' DefaultConnectionProvider'_ arbeiten soll. Bin ich in Schwierigkeiten? ;-) Scheint, ich könnte die Transaktion zu früh töten. – sargue

+1

@sargue: Nein, du bist nicht in Schwierigkeiten. Die lokale Konfiguration wird von Ihrer eigenen Konfiguration abgeleitet. Der 'DefaultTransactionProvider' verwendet lokal einen' DefaultConnectionProvider' und behält die 'Connection' für den Umfang einer Transaktion bei. Ich vermute, das verdient mehr Dokumentation –

+0

Dank @LukasEder. Einige Bearbeitungen der Antwort wurden ausgeführt und als beste aktuelle Lösung akzeptiert. Vielleicht wäre eine Methode beim Transaktionsanbieter hilfreich? 'configuration.transactionProvider(). currentConnection()', die auf dem 'NoTransactionProvider' null zurückgibt oder eine Ausnahme auf andere, exotischere Anbieter wirft, die dies nicht unterstützen. Ich kann ein Problem in GitHub erstellen, wenn Sie denken, dass es nützlich sein könnte. – sargue

Verwandte Themen