Сессии Hibernate и транзакции с потоками - PullRequest
4 голосов
/ 13 января 2011

Я работаю над проектом, который использует Hibernate3 и JDBC для соединения / взаимодействия с нашей базой данных (MSSQL 2008)

В настоящее время мы создаем фабрику сессий в нашем основном классе, затем начинаем транзакцию, затем запускаемновый поток и этот поток создает соединения, а что нет.Я посмотрю, смогу ли я проиллюстрировать это каким-нибудь псевдокодом ...

public static main(String[] args){
    for(...){
        SessionFactory sf = new SessionFactory();
        sf.getCurrentSession.beginTransaction();
        CreateNewThreadedObject.run();
        sf.getCurrentSession.getTransaction.commit();
    }
}

Мой вопрос: это безопасно?Я знаю, что сессии не являются потокобезопасными, но я на самом деле не использую сеанс в потоке.Во всяком случае, я использую транзакцию.Будет ли лучше передавать сессионный компонент в многопоточный объект?Любой совет приветствуется!

Ответы [ 2 ]

5 голосов
/ 13 января 2011

Очень важно, чтобы вы понимали Hibernate Sessions и связь потоков, лучше всего объясните здесь:

http://community.jboss.org/wiki/Sessionsandtransactions

Если вы работаете с веб-приложением, я настоятельно рекомендую шаблон Open Session in View:

https://community.jboss.org/wiki/OpenSessionInView

3 голосов
/ 11 июля 2013

Вы можете инициализировать одиночный SessionFactory. Это на самом деле рекомендуется.

Затем каждый поток должен создать сеанс с использованием фабрики сеансов и выполнить транзакцию (и).

На самом деле это очень распространенный шаблон, используемый в веб-приложениях. Шаблон Open Session in View, о котором упоминает @kvista, в основном представляет собой фильтр сервлета, который создает сеанс, начинает транзакцию, делегирует то, что продолжает обработку запроса, и в конце фиксирует или откатывает транзакцию. И поскольку каждый запрос обрабатывается отдельным потоком в контейнере сервлета, вы можете увидеть, насколько близки эти два случая.

В вашем случае было бы неразумно выполнять много транзакций в каждом потоке. На самом деле это основная идея выполнения пакетных процессов в многопоточной (в идеале JTA) среде. Однако следует отметить, что сеанс представляет собой постоянный контекст, который действует как кэш-память, и вам, вероятно, следует время от времени очищать его, чтобы избежать утечек памяти.

...