Ответ
Да, SessionFactory в Hibernate — это тяжеловесный (heavyweight), потокобезопасный объект, который создается один раз на всё приложение. Его «тяжесть» обусловлена сложной и ресурсоемкой инициализацией.
Причины:
- Singleton на уровне приложения: Создается при старте и используется всеми потоками.
- Затратная инициализация: В процессе построения выполняются:
- Чтение и парсинг конфигурации (
hibernate.cfg.xmlили аннотации). - Построение и валидация метамодели всех сущностей (ORM-маппинг).
- Создание и наполнение кешей второго уровня и кеша запросов (если включены).
- Генерация и подготовка SQL-запросов для основных операций.
- Чтение и парсинг конфигурации (
Пример создания (устаревший, но наглядный API):
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
// Этот вызов выполняет всю тяжелую работу
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Best practice: Создавайте SessionFactory единожды при запуске приложения (например, в ServletContextListener или с помощью LocalSessionFactoryBean в Spring) и используйте dependency injection для его переиспользования. Обязательно закрывайте (sessionFactory.close()) при остановке приложения для освобождения ресурсов.