2010-03-29 4 views
13

Просто интересно, если начало новой транзакции в Hibernate фактически назначает соединение с БД?Запускает ли startTransaction в Hibernate новое соединение с БД?

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

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

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

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

ответ

8

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

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

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

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

+0

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

+1

Фактически, соединение загружается в «сеанс». См. Мой ответ для деталей. –

+0

@Pascal Thivent hm, интересный и логичный :) @illscience, пожалуйста, измените принятый ответ – Bozho

14

Согласно разделу 11.1. Session and transaction scopes документации Hibernate:

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

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

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

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

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

Посмотрите на org.hibernate.impl.SessionImpl#beginTransaction() и перейдите через код для более подробной информации.

+0

+1, конечно (15chrs) – Bozho

+0

@Bozho Спасибо! –

+0

Чинги. Хороший ответ –

Смежные вопросы