beginTransaction в В спящем режиме, выделяют новое соединение с БД?

Просто удивление при начале новой транзакции в В спящем режиме, на самом деле выделяет соединение с DB?

Я заинтересован b/c, наш сервер начинает новую транзакцию для каждого полученного запроса, даже если тот запрос не взаимодействует с DB. Мы рассматриваем соединения с БД как главное узкое место, таким образом, я задаюсь вопросом, должен ли я не торопиться узкий объем моих транзакций.

Искавший везде и не смогли найти хороший ответ. Очень простой код здесь:

    SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);

большое спасибо! a

13
задан Pascal Thivent 9 May 2010 в 13:40
поделиться

2 ответа

(Обновлено в соответствии с комментарием Паскаля Тивента)

Каждый сеанс создает соединение с базой данных, если в этом есть необходимость - например, если транзакция запущена. Соединение не открывается при простом создании сеанса.

Чтобы преодолеть это, вы можете использовать пул соединений , чтобы соединения использовались повторно. Или вы можете убедиться (как кажется, вы сделали), что никакая транзакция не запускается автоматически.

( В этом обсуждаются транзакции только для чтения. Взгляните.)

8
ответ дан 1 December 2019 в 21:52
поделиться

Согласно разделу 11.1. Области сеансов и транзакций документации Hibernate:

A SessionFactory - это дорогостоящий в создании, потокобезопасный объект, предназначенный для совместного использования всеми потоки приложений. Он создается один раз, обычно при запуске приложения, из экземпляра Configuration .

Сеанс - недорогой, небезопасный объект, который следует использовать один раз, а затем отбрасывать для: одного запроса , диалога или единицу работы. Сеанс не получит соединение JDBC или источник данных , если это не потребуется. Он не будет потреблять никаких ресурсов, пока не будет использован .

Чтобы уменьшить количество конфликтов блокировок в базе данных, транзакция базы данных должна быть как можно короче. Длинные транзакции базы данных не позволят вашему приложению масштабироваться до высоко одновременной нагрузки. Не рекомендуется держать транзакцию базы данных открытой в течение времени обдумывания пользователем, пока единица работы не будет завершена.

Теперь, чтобы ответить на ваш вопрос:

  • получение сеанса не немедленно устанавливает соединение (соединение загружается лениво)
  • , а вызывает beginTransaction () вызовет загрузку соединения для данного Session
  • последующие вызовы будут повторно использовать то же соединение

Посмотрите на org.hibernate.impl.SessionImpl # beginTransaction ( ) и просмотрите код для получения дополнительных сведений.

16
ответ дан 1 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: