Hibernate и JSP-транзакция на запрос

Привет, я создаю четырехуровневую программную систему (презентация - JSP, предметная область, логика приложения, постоянство), и я хочу, чтобы мои транзакции находились в спящем режиме для каждого запроса, чтобы я не совершал транзакцию каждый раз, когда я хочу что-то сделать а также то, что я могу отслеживать данные с моими объектами, чтобы обновлять только те свойства, которые были изменены.

Я рассматривал Spring как основу для этого, и как бы я ни хотел реализовать это, моя группа наложила на него вето, и мы не можем его использовать.

Я также просмотрел JTA и не понимаю, как это можно использовать, поскольку я не использую bean-компоненты.

Я думал о таком решении, как наличие метода для закрытия и открытия транзакций, но кажется, что может быть более элегантное решение.

Каким будет лучший способ сохранить мою транзакцию по запросу на основе моей системы?


person Ben Guenter    schedule 27.02.2011    source источник


Ответы (2)


Apache предоставляет SessionFilter для Спящий режим, инструкции после клика.

person David O'Meara    schedule 27.02.2011
comment
Я использую Glassfish в качестве сервера для этой системы. Не вызовет ли это каких-либо проблем с использованием Apache Click? Кроме того, я просмотрел сеансовый фильтр и то, как его реализовать, и есть ли хорошие руководства по настройке файла web.xml? Я попытался использовать их пример, но теги sun-web.xml, которые использует Glassfish, не понравились. - person Ben Guenter; 27.02.2011
comment
это должно быть стандартно web.xml, единственная проблема, о которой я могу думать, это если вы проверяете сервлеты 2.4 dtd, а не 2.5. Если это так, вам нужны все ваши фильтрующие теги перед любыми filter-mappings. Я не вижу конкретных примеров для этого. - person David O'Meara; 27.02.2011
comment
Спасибо за вашу помощь, я уверен, что это решение сработало бы отлично, если бы я использовал apache click с самого начала разработки, в его нынешнем виде я придумал решение простого управления транзакцией со временем жизни мои объектные зависимости, - person Ben Guenter; 27.02.2011

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

Меня интересует, как вы сделали свое приложение с 4 уровнями абстракции, в то время как вы используете ClickServlet для поддержки одной транзакции на запрос. Насколько я знаю, ваша транзакция будет состоять из столько запросов, сколько ваших активных рабочих потоков сервлета.

Если вы хотите использовать возможности ленивой загрузки Hibernate, вы можете:

(1) необходимо поддерживать транзакцию, когда запрос все еще активен (чтобы вы не получили LazyLoadingException), или

(2) вы должны разделить слой, заставить слой передавать DTO и VO вместо передачи модели Hibernate слоям выше.

ИМО последний является более чистым подходом, поскольку основная цель наличия уровней абстракции состоит в том, чтобы упростить их повторное использование, тестирование и разделение задач.

Я предлагаю вам не обрабатывать транзакцию на уровне сеанса/запроса сервлета. Это сделает весь ваш уровень ниже презентации тесно связанным с Servlet API. Обычно это не то, что нам нужно, когда мы хотим иметь слои абстракции. Так что, вероятно, среда Apache Click и ее ClickServlet - не лучший способ сделать это. Весна может справиться с этим лучше. Если на вас наложили вето, то очень плохо.

Если вы не хотите использовать автоматизированную транзакцию Spring, вы все равно можете использовать AspectJ (или другие компоненты аспектно-ориентированного программирования) для прозрачной обработки вашей транзакции (создавайте транзакцию при вводе методов и фиксируйте/откатывайтесь при выходе из методов). Конечно, это сложнее, чем просто принять Spring Framework.

... также то, что я могу отслеживать данные с моими объектами, чтобы обновлять только те свойства, которые были изменены.

Это может быть обработано Hibernate Level 1 Cache + Lazy Loading прозрачно. Вам не нужно делать это самостоятельно. Hibernate будет генерировать SQL для серверной части только тогда, когда сеанс сбрасывается, или кеш L1 заполнен, или при фиксации транзакции. В общем, вам не нужно ничего делать, чтобы свести операторы языка манипулирования данными (DML) к серверной части, обычно Hibernate справляется с этим лучше при правильной настройке.

Я также просмотрел JTA и не понимаю, как это можно использовать, поскольку я не использую bean-компоненты.

Вы можете использовать JPA без bean-компонентов. Это просто API, который вы можете вызывать из любого места.

Я думал о таком решении, как наличие метода для закрытия и открытия транзакций, но кажется, что может быть более элегантное решение.

да. Посмотрите на аспектно-ориентированное программирование Грегора Кицалеса. Spring Framework поддерживает этот готовый АОП. Если ваша команда наложила на это вето, вы все равно можете сделать это самостоятельно.

Каким будет лучший способ сохранить мою транзакцию по запросу на основе моей системы?

Лучший подход (учитывая, что вы запланировали иметь 4 уровня абстракции) — загрузить данные из моделей домена Hibernate в объект передачи данных/объект значения на уровне сохраняемости. Уровень выше, уровень логики приложения, имеет доступ к модели домена Hibernate, но не может передавать модели Hibernate на уровень выше. Чтобы сделать его эффективным, вы должны реализовать разбиение на страницы в этих слоях (иначе вы будете часто загружать все данные в память, что плохо).

Таким образом, в сочетании с аспектированием транзакции, я считаю, что это лучшая практика на данный момент.

person Daniel Baktiar    schedule 28.02.2011