Запускает ли startTransaction в Hibernate новое соединение с БД?
Просто интересно, начнет ли новая транзакция в Hibernate фактически назначить соединение с БД?
Я обеспокоен b/c наш сервер начинает новую транзакцию для каждого полученного запроса, даже если этот запрос не взаимодействует с БД. Мы видим, что соединение с БД является основным узким местом, поэтому мне интересно, не следует ли мне сократить время моих транзакций.
Искал везде и не смог найти хорошего ответа. Самый простой код здесь:
SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory");
sessionFactory.getCurrentSession().beginTransaction();
sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
Большое спасибо!
а
Ответы
Ответ 1
(Обновлено на комментарий Pascal Thivent)
Каждый Session
создает соединение с базой данных, если есть необходимость в этом - например, если транзакция запущена. Соединение не открывается простым созданием сеанса.
Чтобы преодолеть это, вы можете использовать пул соединений, чтобы соединения были повторно использованы. Или вы можете убедиться (как оказалось, что вы сделали), что никакая транзакция не запускается автоматически.
(В этом обсуждаются транзакции только для чтения. Посмотрите.)
Ответ 2
В соответствии с разделом 11.1. Сессии и транзакции документации Hibernate:
A SessionFactory
является дорогостоящий, потокобезопасный объект, предназначенный для совместного использования всеми потоки приложений. Он создан один раз, обычно при запуске приложения, из экземпляра Configuration
.
A Session
является недорогим, не-потоковый объект, который должен быть используется один раз, а затем отбрасывается для: a одиночный запрос, беседа или единая единица работы. A Session
будет не получить JDBC Connection
, или Datasource
, если это не требуется.не будут потреблять ресурсы до тех пор, пока б.
Чтобы уменьшить конфликт блокировок в база данных, транзакция базы данных должен быть как можно короче. Длинный транзакции базы данных будут ваше приложение от масштабирования до высокая параллельная загрузка. Это не рекомендуется хранить базу данных транзакция открыта во время просмотра пользователем времени, пока единица работы не будет полная.
Теперь, чтобы ответить на ваш вопрос:
- Получение
Session
делает не немедленно получение соединения (соединение загружается с ленивым)
- но вызов
beginTransaction()
приведет к загрузке соединения для данного Session
- последующие вызовы будут повторно использовать один и тот же
Connection
Посмотрите org.hibernate.impl.SessionImpl#beginTransaction()
и просмотрите код для более подробной информации.