Индивидуальные проектные решения и решения, обусловленные спецификой J2EE
В ходе проектирования системы в исполняемой cpeде J2EE одни решения проектировщик принимает самостоятельно, а другие — исходя из правил и структуры J2EE. К примеру, J2EE устанавливает местоположение сервлетов JSР и EJB в составе контейнера: сервлеты и JSP находятся в веб-звене, а элементы EJB — в EJB-звене. В то же время архитектура J2EE в некоторых случаях допускает принятие гибких проектных решений — к примеру, в том, что касается реализации безопасности (декларативной и программной), поддержки транзакций (декларативной и программной) и доступа к данным (с контейнерным управлением и с самоуправлением bean). В процессе проектирования компонента проектировщик обладает неограниченными возможностями применения сервлетов, JSP и EJB. В такой ситуации следует избегать опрометчивых решений. К примеру, один из компонентов компании Inmedius допускает сотрудничество двух и более пользователей. Поскольку этот компонент выражает бизнес-логику, допускающую многократное применение, согласно правилам отбора компонентов его следует упаковывать в виде EJB. Углубленный анализ доказывает, что это проектное решение является не- оптимальным. Как показано на рис. 16.2, при отображении проектного решения компонента на четыре логических звена, предусмотренные J2EE, необходимо принимать во внимание побочные факторы. Проблемы многозвенности в J2EE Одна из этих проблем касается производительности. В число основных факторов, способствующих снижению производительности, входит численность вызовов от одного объекта J2EE (от сервлета или EJB) к другому в рамках транзакции. С технической точки зрения любой вызов метода EJB соответствует удаленному вызову, привносящему дополнительные издержки. Способов решения этой проблемы и, следовательно, обеспечения приемлемой производительности компонента всего два: реализация крупномодульных элементов EJB н исключение отношений между сущностными EJB. Еще одна проблема связана с транзакциями, которые управляются либо программно, либо декларативно. Очевидно, управлять транзакциями декларативно в некоторых отношениях проще — в коде отсутствуют операторы начала и завершения транзакции. С другой стороны, разработчики должны принимать во внимание предполагаемый механизм применения сущности J2EE. Согласно простейшему решению, транзакции требуются во всех методах. К сожалению, если насущная необходимость в применении транзакций отсутствует, появляются лишние издержки. Иногда дескриптор размещения предписывает поддержку транзакций даже в том случае, если методы сущности J2EE их не предусматривают. Если контейнер — второй участник транзакции — обратится к такой сущности J2EE, созданная им транзакция аварийно закроется. Декларирование дескриптором размещения поддержки транзакции в конкретном методе представляется более оптимальным решением. Особое внимание следует уделять анализу компонента на предмет выявления аспектов, корректность функционирования которых напрямую зависит от поддержки транзакций. Принятые решения необходимо привести в соответствие с декларативными и программными механизмами, предусмотренными в архитектуре J2EE.
|