Жизненный цикл соединения Jooq - PullRequest
1 голос
/ 30 апреля 2020

Я оцениваю Jooq и хочу подтвердить свое понимание жизненного цикла соединения JDB C.

Я использую пул соединений (Hikari) и настраиваю DSLContext с использованием источника данных.

Насколько я понимаю:

  1. Можно ли создать один DSLContext, который я смогу повторно использовать в своем приложении во многих потоках? Есть ли что-то негативное в этом, если я не изменяю конфигурацию? Contention et c?

  2. Каждый раз, когда я выполняю доступ к базе данных, получает ли Jooq соединение из пула, осуществляет ли доступ к БД, а затем фиксирует и освобождает его? Например:

Result<Record> result = context.select().from(AUTHOR).fetch();
Result<Record> otherResult = context.select().from(BOOKS).fetch();

Каждый из этих запросов будет получать и освобождать новое соединение из пула?

При использовании API транзакции следующим образом:
context.transaction(ctx -> {
        DSLContext trans = DSL.using(ctx);
   ...
});

Соединение будет получено из пула и повторно использовано для всех обращений с использованием контекста trans?

Спасибо !

1 Ответ

1 голос
/ 30 апреля 2020

Я могу создать один DSLContext, который я могу повторно использовать в своем приложении во многих потоках?

Да, вы можете, при условии, что после инициализации вы не измените свой Configuration и его компонентов, например, Settings.

Есть ли какие-либо негативные последствия для этого, если я не изменяю конфигурацию? Contention et c?

Au contraire, это рекомендуемый способ использования DSLContext. Используя его, вы получите выгоду от кэширования, например, для рефлексии, если вы используете Result.into(MyDto.class) методы и т. Д. c.

Каждый раз, когда я делаю доступ к базе данных, получает ли Jooq соединение из пула делать доступ к БД, а затем фиксировать и освобождать его?

Да, вот как это работает, если ваш DataSource поддерживается пулом. Конечно, пул может предоставлять jOOQ одно и то же соединение каждый раз, в зависимости от транзакционных контекстов, которые управляются вне jOOQ. jOOQ не волнует.

При использовании API транзакций, подобного этому: [...] Соединение будет получено из пула и повторно использовано для всех обращений с использованием контекста транс?

Метод transaction() получает соединение и сохраняет его в течение TransactionalRunnable, которое вы ему передаете (т.е. лямбда). Ваш вложенный экземпляр DSLContext trans теперь будет работать с «кэшированным» Connection и не сможет получать новые соединения от вашего DataSource.

.
...