2015-11-11 3 views
2

Возможно ли получить доступ к базовому JDBC-соединению из jOOQ TransactionRunnable или TransactionCallable?Доступ к JDBC-соединению из транзакции jOOQ

Я хотел бы быть в состоянии получить доступ к PostgreSQL большой объект API, который вы получаете от соединения:

final LargeObjectManager manager = connection.unwrap(PGConnection.class).getLargeObjectAPI();

AFAICT вы только получаете доступ к ConnectionProvider который, если я называю aquire() на, Безразлично Похоже, я собираюсь в конечном итоге с тем же соединением для своих больших объектов, что и для моих утверждений.

+0

реализовать свой собственный провайдер соединений и обеспечить способ доступа к последнему/току/независимо соединение ? – assylias

+0

Это звучит как больше работы, чем использование простой JDBC, которую я сейчас делаю. Чтобы уточнить, возникает вопрос, поддерживает ли jOOQ API получение текущего соединения, и я просто не могу его найти, или он не поддерживает его. –

ответ

2

В jOOQ 3.7 #4552 был реализован для обеспечения доступа к Configuration «ы Connection через ConnectionRunnable. Например:

DSL.using(configuration) 
    .transaction((Configuration c) -> { 
     DSL.using(c).connection(connection -> { 
      LargeObjectManager manager = connection.unwrap(PGConnection.class).getLargeObjectAPI(); 
      // ... 
     }); 
    }); 

Этот API будет внутренне назвать acquire() и release(), для удобства, так что следующее решение эквивалентно, но более многословен:

DSL.using(configuration) 
    .transaction((Configuration c) -> { 
     Connection connection = c.connectionProvider().acquire(); 
     try { 
      LargeObjectManager manager = connection.unwrap(PGConnection.class).getLargeObjectAPI(); 
      // ... 
     } 
     finally { 
      c.connectionProvider().release(connection); 
     } 
    }); 

Как Connection получается из «транзакционной» Configuration c , вы можете быть уверены, что получите доступ к правильному Connection. Даже если доступ к нему несколько раз, она всегда будет таким же, как jOOQ внутренне заменяет собственную ConnectionProvider по DefaultConnectionProvider, действующим на транзакционной Connection

+0

Спасибо, Лукас. Я использую 3.5, поэтому я предполагаю, что на данный момент я использую 'getSql()' и простой JDBC, но это здорово. –

Смежные вопросы