Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hibernate и транзакции. Правила хорошего тона, hibernate сессия транзакция 
:(
    Опции темы
iluvatar
Дата 14.5.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: 4
Всего: 4



Задумался тут - кто как реализовывает механизм транзакций/сессий.

Во всех примерах, которые я видел, создают одну сессию на один запрос с клиента и по транзакции на каждый запрос к базе.
Мне логичней кажется, чтобы транзакция тоже была одна. Например, хотим сохранить 20 новых объектов, но на 10-м сваливаемся с ошибкой и в этом случае транзакцию не откатить и 9 объектов будут созданы. Мне кажется более приемлимым создавать транзакцию на входе в сервлет и делать коммит на выходе. Или я неправильно понимаю эти механизмы? Выскажитесь по этому поводу.
PM MAIL ICQ   Вверх
COVD
Дата 15.5.2011, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Если вы хотите вставку 20 обьектов осуществить в одну транзакцию, то и рассматривать их придется, очевидно, как один обьект, т.е. коллекцию. Клиент пересылает в сервлет коллекцию. Пока вся коллекция не получена сервлетом, никаких операций вставки в базу не происходит. Посередине пересылки может произойти обрыв соединения и надо начинать все сначала. Если соединение ненадежное, а коллекция большая, то такие неудачные попытки могут быть бесконечны.  
PM MAIL   Вверх
Старовъръ
Дата 15.5.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



0. Сервлет - это не то место, где должна быть бизнес логика, сервлет - это обработка события на View.
1. Самая распространенная схема - это один запрос от клиента создает одну транзакцию.
2. Транзакциями управляет обычно уровень Сервисов, однако можно это делать и в Фильтре, так называемый Open Session In View (есть две схемы этого шаблона, тебе нужна та, которая работает без re-attache объектов к сессии). Однако тем не менее уровень сервисов должен все равно быть транзакционным, для того, чтоб понять как одновременно и Фильтр и Сервис мог управлять транзакциями, нужно посмотреть на Transaction Propagation в спринге и что они дают.
PM MAIL WWW   Вверх
MisterCleric
Дата 16.5.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Ничего смертельного в твоем желание нет: это архитектура, которая имеет право на жизнь.
Раньше это был SessionFacade.
Теперь есть более крутые решения Seam managed transactions
Вот мой пример более легкого решения "Транзакция на запрос" через фильтр. Но правда с помощью Spring:
TransactionFilter.java
Код

public class TransactionFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {
    }
}

Spring context
Код

<tx:jta-transaction-manager/>

    <bean id="transactionFilterTarget" class="com.my.project.web.spring.TransactionFilter"/>

    <bean id="transactionFilter" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          p:target-ref="transactionFilterTarget">
        <property name="transactionAttributes">
            <value>
                doFilter*=PROPAGATION_REQUIRED
            </value>
        </property>
    </bean>

web.xml
Код

<filter>
        <filter-name>transactionFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>transactionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Теперь у нас есть транзакция от начала запроса до конца ответа.
Плюс таким образом я победил LazyInitializationException

Авось да будет полезным


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
ynblpb
Дата 16.5.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Еще вариант без спринга Как я победил LazyException
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0974 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.