2015-09-07 26 views
6

Używam jOOQ wewnątrz istniejącego projektu, który również używa niestandardowego kodu JDBC. Wewnątrz jOOQ transaction muszę wywołać inny kod JDBC i muszę przejść przez aktywne połączenie, aby wszystko dostało się do tej samej transakcji.Jak uzyskać podstawowe połączenie wewnątrz transakcji za pomocą jOOQ?

Nie wiem, jak odzyskać podstawowe połączenie wewnątrz transakcji 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, ...); 
}); 

Czytając dokumenty i wystającym nieco na kodzie źródłowym mój Najprościej jest to:

configuration.connectionProvider().acquire() 

Ale nazwa jest nieco mylące w tym konkretnym przypadku zastosowania. Nie chcę nowego połączenia, tylko obecnego. Myślę, że to jest droga, ponieważ konfiguracja jest wyprowadzona i zawsze otrzymam to samo połączenie, ale nie jestem pewien i nie mogę znaleźć odpowiedzi w dokumentacji.

Odpowiedz

2

Interfejs API jOOQ nie zawiera żadnych założeń dotyczących istnienia połączenia "bieżącego". W zależności od konkretnych implementacji ConnectionProvider, TransactionProvider itd. Może to być możliwe, ale nie musi.

Twoje obejście jest generalnie w porządku. Tylko pamiętaj, aby śledzić umowy SPI ConnectionProvider „s:

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

powyższe jest dobrze, gdy używasz jOOQ na DefaultTransactionProvider, na przykład.

Uwaga istnieje oczekujące żądanie cecha #4552 która pozwoli na uruchomienie kodu w kontekście ConnectionProvider oraz jej wezwania do acquire() i release(). Oto, jak to będzie wyglądać:

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

Dzięki @LukasEder za szybką odpowiedź. Używam 'DefaultTransactionProvider'. "ConnectionProvider" to 'DataSourceConnectionProvider' i brak' DefaultConnectionProvider'. Widziałem, że metoda 'ConnectionProvider.release()' nie robi nic w tym ostatnim i zamyka połączenie w pierwszym. 'DefaultTransactionProvider' mówi w dokumentach, które _intended do pracy z' DefaultConnectionProvider'_. Mam kłopoty? ;-) Wygląda na to, że zbyt szybko zabiję transakcję. – sargue

+1

@sargue: Nie, nie masz kłopotów. Lokalna 'Konfiguracja' pochodzi z twojej własnej' Konfiguracja'. 'DefaultTransactionProvider' lokalnie używa' DefaultConnectionProvider' i zachowuje 'Connection' dla zakresu transakcji. Podejrzewam, że zasługuje na więcej dokumentacji. –

+0

Dzięki @LukasEder. Zrobiono trochę edycji odpowiedzi i zaakceptowano jako najlepsze bieżące rozwiązanie. Może przydatna byłaby metoda dostawcy transakcji? 'configuration.transactionProvider(). currentConnection()' który zwróci wartość null na 'NoTransactionProvider' lub rzuci wyjątek na innych, bardziej egzotycznych dostawców, którzy nie mogą tego obsługiwać. Mogę utworzyć problem w GitHub, jeśli uważasz, że może być przydatny. – sargue