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