2014-11-17 5 views
1

Я часто сталкивался с этими условиями. Является ли их разница b/w 2 из них?Логическая единица работы и единая единица работы в JPA, JTA

В следующей части Java кода, метод потокобезопасно:

class Counter { 
    private int i = 0; 

    public synchronized void inc() { 
     i++; 
    } 
} 

В контексте к SessionFactory и сессии в Hibernate затем,

SessionFactory (org.hibernate.SessionFactory) - A thread-safe 

Session (org.hibernate.Session) - A single-threaded, short-lived object representing a 
conversation between the application and the persistent store. 

Я запутаться здесь в понимании их определение.

Все я впитываю, что с SessionFactory является поточно-, любой поток должен сначала получить блокировку, а затем будет работать на него, т.е. Реализации гарантированно быть свободными от при одновременном доступе к нескольким потокам. (Уведомление я написал одновременно и не parellely). После того, как один поток завершит свою работу, другой в очереди будет приобретать блокировку тогда и так далее. Ни один из них не будет работать над ним ровно в одно и то же время.

Session является не поточно, и она представляет собой однопоточных единицу работы.

Разве это после сеанса, несколько сеансов (в сеансе) будут каждый раз развивать свою работу в своей собственной нити?

ответ

1

SessionFactory является потокобезопасным, и у вас есть singleton Sessionfactory для данного DataSource.

Сессии могут either be created for the life time of a single request or even extended to span over multiple user requests.

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

Таким образом, сеансу не следует обращаться одновременно. Вот почему вам не нужно синхронизировать свои объекты, по крайней мере, не с точки зрения спящего режима. Каждая сессия загружает свою собственную копию объекта, а параллелизм обычно обеспечивается optimistic locking, потому что желательно иметь application-level repeatable reads.

Таким образом, объекты не должны синхронизироваться. Управление параллелизмом происходит внутри базы данных, а не в вашей логике приложения. Каждый запрос клиента всегда выдает инструкции DML в области транзакции физической базы данных и database transactions always acquire locks when rows get changes (even for READ_COMMITTED).

В целом, сессия не защищена от протектора вместе со всеми ее прикрепленными объектами. Запуск фабрики является потокобезопасным, потому что вы получаете только один экземпляр singleton для каждого DataSource и используете его для создания новых сеансов.

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