Стратегия приобретения соединения Hibernate против Spring - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь понять, когда именно соединение с базой данных приобретается в приложении, которое использует Hibernate в качестве ORM & Spring для управления транзакциями.

В этой статье написано:

Если менеджер транзакций решит создать новую транзакцию, он:

создаст нового менеджера сущностей

, связывает менеджер сущностей с текущим потоком

захватить соединение из пула соединений БД

связать соединение с текущим потоком

Однако здесь говорит:

Hibernate откладывает получение соединения с базой данных до тех пор, пока текущая транзакция не выполнит свой первый оператор SQL (вызванный операцией чтения или записи). Эта оптимизация позволяет Hibernate сократить интервал физической транзакции, что увеличивает вероятность получения соединения из пула.

Я не могу понять, как Hibernate может задержать получение соединения, если Spring решит его приобрести. до этого.

1 Ответ

0 голосов
/ 16 апреля 2020

I can't understand how can Hibernate delay the connection aquisition if Spring decides to aquire it before.

Решение принимается менеджером транзакций и поэтому потенциально JpaTransactionManager/HibernateTransactionManager

Hibernate 5.2.0 вводит новое свойство hibernate.connection.provider_disables_autocommit

С помощью этого Hibernate может задерживать получение соединения с базой данных до тех пор, пока не будет выполнен оператор JDB C. в противном случае соединение с базой данных получается при входе в метод сервиса @Transactional.

Таким образом, чтобы разрешить Spring связывать это свойство с JPATransactionManager во время настройки контекста Spring, вы должны установить это свойство в вашем application.properties/yaml - -> spring.jpa.properties.hibernate.connection.provider_disables_autocommit

Последнее, что необходимо сделать для этого -> установить значение false для провайдера пула соединений (по умолчанию HikariCP с момента загрузки Spring 2) spring.datasource.hikari.auto-commit=false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...