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.
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
@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 –
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