2013-09-12 6 views
1

В настоящее время я переучиваю Hibernate, который я не использовал в течение примерно пяти-шести лет, и я пытаюсь вспомнить, как мы использовали его на старом рабочем месте (Hibernate in Action on заказываю ...)Использование SessionFactory без весны?

В настоящее время я не использую весну в своем приложении, и мне интересно, как лучше всего получить SessionFactory в моем приложении, чтобы поделиться им с моими помощниками по сохранению - я, кажется, Напомним, что вы, как правило, только хотите его использовать. В моем текущем коде я выбираю сделать так, как это в классе, общей для всех моих peristence «помощников»:

public abstract class AbstractHelper { 

    private static final String CONFIG = "configuration.xml"; 
    private static SessionFactory sessionFactory = null; 

    /** 
    * @return SessionFactory the Hibernate SessionFactory. 
    */ 
    public static SessionFactory getSessionFactory() { 
    if (sessionFactory == null) { 
     Configuration configuration = new Configuration(); 
     configuration.configure(CONFIG); 
     ServiceRegistryBuilder serviceRegistryBuilder = 
      new ServiceRegistryBuilder().applySettings(configuration.getProperties()); 
     sessionFactory = configuration.buildSessionFactory(
      serviceRegistryBuilder.buildServiceRegistry()); 
    } 

    return sessionFactory; 
    } 

} 

ли это даже иметь смысл для людей, или я должен идти об этом в другой по причинам эффективности и т. д.?

+2

Для меня это кажется прекрасным (так мы это делали в старину). Единственное, что я хотел бы предложить, - это заботиться о потоках. Я бы сделал блок, который синхронизирует SessionFactory. –

+0

Точнее весь блок 'if' (включая нулевую проверку). –

ответ

2

Есть небольшой шанс, что у вас могут возникнуть проблемы, когда к вашему коду обращаются из нескольких потоков. Когда два потока обращаются к getSessionFactory(), можно создать SessionFactory, а другой может достигнуть if(sessionFactory == null), прежде чем первая будет назначена переменной.

Самый простой способ исправить это - сделать getSessionFactory()synchronized. Это может привести к некорректной блокировке и влиянию на производительность.

Для более сложных методов см., Например, here или сделать некоторые поисковые запросы на «Singleton pattern java».

+0

Да, спасибо. Как уже говорилось в @Ean, с тех пор я синхронизировал код, а не метод, но используя класс как блокировку в синхронизированном блоке кода внутри нулевой проверки. – f1dave

+1

Нулевая проверка также должна быть синхронизирована - в противном случае второй поток в вышеуказанной ситуации уже войдет в if-блок перед остановкой блокировки. Попытка избежать этого приведет к чему-то вроде DoubleCheckLocking, который также имеет несколько странных трудностей ... –

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