Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 4. Распределенные компненты EJB 221
интерфейс имеет родителем javax.ejb.EJBObject интерфейс. Каждый метод, объявленный в интерфейсе, должен иметь соответствующий ме­тод в основном классе Enterprise bean; методы должны иметь одинако­вые имя и сигнатуры. Кроме того, методы remote-интерфейса должны возбуждать исключение java.rmi.RemoteException и возвращать кор­ректные типы RMI. Все методы remote-интерфейса должны быть объ­явлены как public и возбуждать исключение java.rmi.RemoteException. Кроме того, аргументы этих методов и возвращаемые ими результаты должны иметь типы, соответствующие требованиям RMI. Должно быть обеспечено соответствие между методами основного класса EJB и мето­дами его remote-интерфейса. Каждая пара методов должна иметь одно и то же имя, число и тип аргументов, тип результата и список возмож­ных исключений.
1. import java.rmi.RemoteExcepton;
2. import javax.ejb.*;
3. public class SortBean implements javax.ejb. SessionBean {
4. public void setSessionContext(javax.ejb.SessionContext sessionContext) {}
5. public void ejbCreate() throws java.rmi.RemoteException {}
6. public void ejbRemove() throws java.rmi.RemoteException {}
7. public void ejbActivate() throws java.rmi.RemoteException {}
8. public void ejbPassivate() throws java.rmi.RemoteException {}
Для того чтобы клиент мог взаимодействовать с экземпляром session
bean, программист должен написать все три составные части EJB, опи­санные выше. Клиентское приложение использует home-интерфейс ses­sion bean для поиска и получения ссылки на его remote-интерфейс. По­сле получения такой ссылки клиент может обращаться к любому мето­ду remote-интерфейса. Клиент íå знает, является ýòîò метод локальным или удаленным. С точки зрения клиента, вызов удаленного метода выглядит так же просто, как вызов любого локального метода. Контейнер EJB передает вызов клиента настоящему (и невидимому для клиента) экземпляру session bean, используя необходимый коммуника­ционный протокол, а затем возвращает результат вызова клиенту через remote-интерфейс.
В отличие от Entity bean, в Session bean отсутствует Primary key
класс, поскольку session bean не обращается к базе данных.
Согласно спецификации EJB, по соглашению, предлагаемому компа-
нией SUN, имя remote-интерфейса состоит из двух частей. Первая эк­вивалентна имени bean, для которого создан интерфейс, другая содер­жит постфикс Home.
Интерфейс Remote используется EJB-клиентом для организации до-
ступа к бизнес-методам Enterprise bean. В нем также содержатся мето­ды по созданию и удалению экземпляров Enterprise bean.
Remote interface должен отвечать следующим требованиям:
расширяться от java.ejb.EJBObject интерфейса;
включает все бизнес-методы, описанные в enterprise bean;
параметры, возвращаемые в каждом методе, должны быть валид-
ными при использовании RMI;
222 Часть 4. Распределенные компненты EJB
обрабатывать исключения java.rmi.RemoteException.
setSesionContext () метод должен обеспечивать установку контек-
ста выполнения Enterprise bean;
должны использоваться: методы, наследуемые remoteInterface от
javax.ejb.EJBObject;
метод getEJBHome() должен возвращать home объект;
метод getHandle() — указывать обработчик EJBObjects;
метод getPrimaryKey() — возвращать значение первичного ключа,
объект Primary key;
метод isIdentical() — сравнивает два EJBObjects на эквивалент-
ность;
метод Remove() — удаляет Enterprise bean из контейнера и сведе-
ния о Enterprise bean в основной базе данных.
31.9. Жизненный цикл Session bean
Клиент это два разных типа приложений. Web-клиент не может не-
посредственно обратиться к session bean, для этого Web-клиент должен использовать промежуточный элемент в виде servlet или JSP-страницы. Для других Java-приложений используется RMI, поэтому запрос посту­пает сразу в EJB-контейнер.
В общем случае жизненный путь session bean делится на несколько
этапов (рис. 4.5):
1. В ответ на запрос клиента контейнер создает новый объект.
2. Экземпляр EJB готов к выполнению запросов клиента. Такое его
состояние называется «method ready state».
3. Бизнес-методы EJB могут выполняться как в контексте транзак-
ции, так и вне любой транзакции — в зависимости от значения атрибу­тов в Дескрипторе Поставки и контекста транзакции клиента.
Рис. 4.5. Жизненный цикл Session bean
Часть 4. Распределенные компненты EJB 223
4. Нетранзакционные методы session bean выполняются экземпляром
в состоянии method ready.
5. Экземпляр EJB становится участником транзакции, когда клиент
вызывает его транзакционный метод. Правильную работу с контекстом транзакции обеспечивает контейнер. Завершение транзакции (подтвер­ждение или откат) выполняется сервисом транзакций.
6. В определенный момент контейнер может выгрузить экземпляр
EJB из памяти. В этом случае выполняется деактивизация (passivation) EJB с записью его состояния в хранилище. Session-Компонент не может быть выгружен, если он участвует в транзакции.
7. Если клиент вызывает другой метод выгруженного EJB, контейнер
снова загружает его в память. При этом происходит восстановление его состояния из хранилища, и EJB готов выполнить запрос клиента. В от­вет на вызов клиентом метода remove() контейнер уничтожает экземп­лярEJB. Он может сделать это и о истечении определенного интервала времени (по тайм-ауту).
С точки зрения используемых методов свой жизненный цикл Session
bean начинает с момента создания экземпляра session bean, используя метод create(), описанный в интерфейсе Home. Разница в жизненном цикле различных session bean, будет указана для каждого такого слу­чая. В ответ на вызов метода create() контейнер производит следующие действия: создает и размещает в памяти экземпляр session bean.
Затем контейнер вызывает метод setSessionContext (). Этот метод ис-
пользуется для организации доступа вновь созданного экземпляра к си­стемным сервисам. Наконец контейнером вызывается метод ejbCreate(). Именно на данном этапе контейнер определяет, как вызываются мето­ды — транзакционно или нетранзакционно. Если бизнес-методы вызы­ваются транзакционно, то после этого Session bean делает свою работу, пока транзакции не закончатся. Перед началом транзакции вызывается метод afterBegin(), если такой метод реализован в данном классе, кли­ентские бизнес-методы взаимодействуют с бизнес-методами, опреде­ленными в remote interface вызываемого EJB. Метод вызывается befo­reComplete() перед завершением транзакции, при условии, что данный метод существует. Транзакции может или осуществиться, или быть прерванной. Когда транзакция полностью прошла, контейнер может вы­звать метод afterCompletion() при условии существовании оного. При прерывании ( rollback) транзакции, значение данных в контейнере оста­ется таким же, как до начала транзакции. При нетранзакционном вызо­ве контейнер просто вызывает бизнес-методы.
После первого этапа session bean переходит в состояние готовности.
В этом состоянии клиент вызывает бизнес-методы, описанные в интер­фейсе remote. Действия контейнера в этом состоянии определяются тем, какие методы вызывались, транзакционые или нетранзакционные. Контейнер управляет EJB по своему собственному алгоритму. Когда контейнер определяет, что session bean находится в состоянии «долгоиг­рающего», контейнер перемещает session bean в резервный пул мето­дом ejbPassivate(), куда он не может быть помещен, если имеет связан­ную с session bean транзакцию. Eсли клиент вызывает методы session
224 Часть 4. Распределенные компненты EJB
bean, находящегося в резервном пуле, то контейнер активизирует EJB, вытаскивая его из пула методом ejbActivate().
Вызов транзакционных методов основан на ассоциации бизнес-мето-
дов с транзакциями. То есть действие метода продолжается до тех пор, пока транзакция не совершится полностью. В этом случае контейнер вызывает соответствующие методы.
Первым вызывается метод afterBegin(), описанный в bean классе. Затем вызываются бизнес-методы remote интерфейса, необходимые
клиенту.
Экземпляр bean использует beforeCompletion(), описанный в основ-
ном bean классе, выполняемый до полного завершения транзакции. По­сле завершения транзакции контейнер вызывает метод afterCompleti­on(), проверяющий ее результат. Если произошел откат, т. е. транзак­ция не завершилась, stateful session bean переходит в состояние до выполнения транзакции, а bean Stateless session beans не работает с транзакционными методами.
При вызове нетранзакционных методов контейнер просто вызывает
бизнес-методы.
Контейнер использует собственный алгоритм по размещению в па-
ìÿòè EJB.
Еще один вид состояния, в котором может находиться session bean —
активное или не активное. Контейнер сам определяет, как долго stateful session bean пребывает в памяти и, вызывая метод ejbPassivate(), поме­щает по необходимости session bean в резервный пул памяти. Stateful session bean не может быть деактивирован вышеуказанным методом в момент прохождения транзакции. Если клиент вызывает деактивиро­ванный EJB, контейнер активизирует состояние stateful session bean, вызывая метод ejbActivate() method. С stateless bean все и так понятно, он не является активным, а значит, на него не распространяются выше­изложенные методы.
Последнее состояние session bean — состояние удаления. Жизнь session bean заканчивается при вызове контейнером метода
ejbRemove(). Если по каким-либо причинам контейнер вызывает метод ejbRemove(), при выполнении транзакции, то будет сгенерирована иск­лючительная ситуация javax.ejb.RemoveException. После чего bean бу­дет удален, а вызываемый метод сгенерирует исключительную ситуа­цию java.rmi.NoSuchObjectException. Контейнер содержит специальный метод удаления через определенный промежуток времени. Параметр ti­meout, указанный в дескрипторе, передает указанное значение в метод timeout(), вызываемый контейнером.
В отличие от session bean (stateful), описанного выше, всеми вопроса-
ми цикла жизни stateless session bean ведает EJB-контейнер. Цикл жиз­ни такого session bean очень прост: когда контейнер создает новый эк­земпляр такого bean, контейнер вызывает методы setSessionContext() и ejbCreate() основного класса EJB. Новый экземпляр помещается в пул таких объектов, и любой из них готов обслуживать запросы клиентов. Поскольку stateless-объекты не отслеживают своего состояния, контей­нер для выполнения запроса клиента адресует этот запрос любому объ­екту из пула. При удалении контейнером объекта из пула он вызывает
Часть 4. Распределенные компненты EJB 225
метод session-объекта. Действия по созданию и удалению экземпляров stateless session-bean из пула не связаны с вызовом методов create() или remove() home-/remote-интерфейсов. Цикл жизни таких объектов опре­деляется профилями контейнера (container policies).
Основные методы Session bean:
1) setSessionContext() — метод, описывающий системное окружение
и свойства контейнера, в котором выполняется session bean. EJB-кон­тейнер вызывает этот метод, чтобы ассоциировать экземпляр EJB с контекстом сессии. Интерфейс SessionContext объявляет методы для доступа к свойствам времени выполнения контекста, в котором выпол­няется сессия. Как правило, объект сохраняет этот контекст как часть своего состояния;
2) ejbRemove() — вызывается контейнером прежде, чем session bean
прекратит свое существование, обычно через определеное количество времени;
3) ejbActivate() — предназначен для придания session bean статуса
активированного session bean;
4) ejbPassivate() — деактивирует session bean. Уведомления о выполнении активизации и деактивизации позволяют
реализовывать эффективные схемы управления ресурсами.
Глава 32. Последние штрихи
Последним шагом при создании EJB является написание описателя
(deployment descriptor) и помещение его в jar-архив созданных классов. И уже после создания jar-архива EJB можно помещать в контейнер любого EJB-сервера, при этом обязательно следует учитывать специ­фику каждого EJB-сервера.
32.1. Дескриптор EJB (deployment descriptor)
Создание EJB — полдела. Далее необходимо описать, что будет де-
лать созданный EJB и как с ним должен работать EJB-контейнер. По­сле того как написаны соответствующие классы и интерфейсы, EJB подготовлен для поставки. Оттранслированный код помещается в стан­дартный архивный файл Java-файл ejb-jar. Этот файл может содер­жать один или несколько байт-кодов классов EJB. Данный jar-архив со­держит интерфейсы, классы и дескриптор для каждого размещенного в архиве EJB.
Под процессом «поставки» EJB понимается установка его ejb-jar-
файла в контейнер EJB. Процесс поставки включает в себя:
1) проверку, что все составные части EJB соответствуют друг другу;
2) регистрацию EJB в Naming Service;
3) обеспечение доступа к экземпляру через коммуникационную сис-
тему сервера EJB;
4) реализацию управления транзакциями и отслеживание профилей
безопасности.
226 Часть 4. Распределенные компненты EJB
В контейнере может быть установлено любое число EJB. Контейнер
EJB предоставляет как среду выполнения для своих EJB, так и инстру­менты для выполнения процесса поставки.
Информация, находящаяся в Дескрипторе Поставки, используется
для задания значений атрибутов EJB. Эти атрибуты определяют пове­дение EJB при его взаимодействии с конкретной средой исполнения.
В дескрипторе описывается следующая информация:
1. Имена классов, содержащие описание home- и remote-интерфей-
ñîâ.
2. JNDI-имя home-интерфейса для Enterprise bean.
3. Переменные для использования в CMP Enterprise bean.
4. Описание транзакционных механизмов.
5. Атрибуты обеспечения безопасности.
6. Специальные атрибуты поставщиков EJB-контейнера. Дескриптор содержит атрибуты и системные переменные, необходи-
мые для вызова EJB. Чаще всего в роли дескриптора выступает обыч­ный текстовый файл, но в последнее время все большую популярность для описания дескрипторов приобретают XML-документы. Структура дескриптора содержит несколько основных элементов и дополнитель­ные EJB. Обращение к дескриптору очень похоже на процесс инициали­зации servlet. Для создания XML-документа, который впоследствии по­служит дескриптором EJB, можно использовать любой XML-редактор или в крайнем случае текстовой редактор. В большинстве современных средств разработки EJB для создания дескриптора используются встроенные утилиты. У каждого Application Server свой собственный EJB-контейнер и свой собственный EJB-дескриптор. Но большая часть параметров дескриптора стандартизирована и используется во всех контейнерах, поддерживающих спецификацию 1.1. EJB. Типы дескрип­тора описываются при помощи атрибутов. Название атрибута и его зна­чение позволяют управлять бизнес-логикой Enterprise bean без измене­ния кода, разработчик может в любой момент изменить параметры де­скриптора.
Кроме самого Enterprise bean, в дескрипторе может содержаться ин-
формация о приложении, работающем с EJB.
Подводя итог, можно описать приблизительную структуру дескрип-
òîðà.
Для всех Enterprise bean указываются: Имя Enterprise bean. Класс Enterprise bean. Home интерфейс Enterprise bean. Remote интерфейс Enterprise bean. Type Enterprise bean. Переменные системного окружения:
1. Описание переменных хранящихся в базе данных.
2. Описание самих EJB.
3. Уровень секретности. Конкретно для session bean: Тип Session EJB. Тип транзакции используемой в Session EJB.
Часть 4. Распределенные компненты EJB 227
Для Enterprise entity beans используются: Persistence managed type Entity bean. Primary key class Entity bean. И специально для CMP Enterprise bean: Переменные, используемые в CMP.
1. <?xml version=’1.0’ standalone=’yes’ ?>
2. <ejb-JAR>
3. <input-file>SampleIn.jar</input-file>
4. <output-file>Sample.jar</output-file>
5. <entity-bean dname="com/rrlabs/ejb/sample/Sample .ser">
6. <primary-key>com. rrlabs.ejb.sample.SamplePrimaryKey</primary-key>
7. <re-entrant value=false/>
8. <container-managed>accountId</container-managed>
9. <container-managed>type</container-managed>
10. <container-managed>balance</container-managed>
11. </entity-bean>
12. <!—Îïècàíèå session bean —!>
13. <input-file>SissionSampleIn.jar</input-file>
14. <output-file>SessionSample.jar</output-file>
15. <session-bean dname="com/rrlabs/ejb/sample/bank/Transaction.ser">
16. <session-timeout>0<\session-timeout>
17. <state-management>STATELESS_SESSION<\state-management>
18. <remote-interface> com/rrlabs/ejb/sample/bank/Transaction </remote­interface>
19. <enterprise-bean> com/rrlabs/ejb/sample/bank/Transaction.TransferBe­an</enterprise-bean>
20. <JNDI-name>Transfer </JNDI-name>
21. <transaction-attr value="TX_REQUIRED"/>
22. <isolation-level value="SERIALIZABLE"/>
23. <run-as-mode value="CLIENT_IDENTITY"/>
24. <dependency> com/rrlabs/ejb/sample/bank /InsufficientFundsExcepti­on.class</dependency>
25. <env-setting name="ACCOUNT_NAME">Account<env-setting>
26. <transaction-attr value="TX_REQUIRED"/>
27. <method-control>
28. <method-name>getBalance</method-name>
29. <parameter>long</parameter>
30. <transaction-attr value="TX_SUPPORTED"/>
31. </method-control>
32. </session-bean>
33. <datasource>
34. <res-ref-name>jdbc/SavingsDataSource</res-ref-name>
35. <url>jdbc:db2:sample</url>
36. <driver-class-name>com.ibm.jdbc.db2.app.DB2driver</driver-class-name>
37. </datasource>
38. </ejb-JAR>
228 Часть 4. Распределенные компненты EJB
Каждый дескриптор, основанный на XML-документе, имеет ряд
основных конструкций. Поскольку дескриптор описан с помощью XML, то обязательным является пролог. Далее содержится основной тег, от­крывающий и закрывающий описание Enterprise bean. Это так называ­емый заголовочный тег. Данный тег <ejb-JAR> имеет тело и конечный элемент </ejb-JAR>. Именно в теле этого тега указываются все осталь­ные теги. Все Enterprise bean содержатся в архивах. По усмотрению разработчика это могут быть как стандартные zip-архивы или же архи­вы нового типа jar-архивы.
Тег <input file > описывает архивы, содержащие один или несколько
Enterprise bean и EJB. Другой подобный тег <output file> содержит имя архива, в который будут помещены создаваемые EJB.
Для созданного Entity bean используются специальные теги в деск-
рипторе. Открывающийся <entity-bean тег содержит атрибут dname, значением которого является полное имя дескриптора, предназначенно­го для данного Entity bean. Между открывающимся и закрывающимся тегом </Entity bean> содержатся специальные атрибуты для каждого Entity bean:
<primary-key> — полное имя для primary key class; <re-entrant> — указанный тег может принимать два логических
значения true или false. Значение true — указывает, что данный Entity bean является участником процесса, указывает, какие методы EJB мо­жет вызывать внутри себя или у других EJB;
<container-managed> — тег описывает постоянные поля, используе-
мые в CMP entity bean. Каждая постоянная, хранимая в базе данных «поле» (переменная) описывается в собственном теге <container-mana­ged>.
Для каждого session bean используются свои теги: <session bean> содержит атрибут dname. Значение атрибута содер-
жит полное имя созданного дескриптора, ассоциированного с session be­an. Между открывающими и закрывающими тегами содержатся специ­альные теги, предназначенные только для session bean;
<session-timeout> — тег определяет количество времени в секундах,
прежде чем контейнер удалит session bean. Значение ноль указывает, что session bean будет удален через максимальное время ожидания. По умолчанию максимальное время ожидания соответствует 600 секундам;
<state-management> — â теге указывается òèï session bean:
STATELESS_SESSION èëè STATEFUL_SESSION.
Помимо этого, разработчик вправе добавить собственные теги по ра-
боте с Enterprise bean. Следующие теги предназначены для всех типов Enterprise beans:
<remote-interface> — указывает полное имя remote-интерфейса. Ес-
ли тег указан в теле Entity bean, то соответственно имя интерфейса для этого bean.
<enterprise-bean> — полное имя основного класса, то же самое, что
и для remote-интерфейса.
<JNDI-name> — указывается имя home интерфейса с использова-
íèåì JNDI.
Отдельное место занимают атрибуты контроля транзакций.
Часть 4. Распределенные компненты EJB 229
Транзакционные атрибуты определяет манеру вызова контейнером
различных методов EJB. Два основных атрибута содержит дескриптор. Атрибуты устанавливаются отдельно для каждого метода или для всех методов единолично. В EJB-сервере системное окружение описывает взаимодействие каждого Entity bean с определенной транзакцией. Каж­дый EJB-клиент должен инициализировать транзакцию, прежде чем вызывать метод bean. Транзакционные методы могут использоваться как для каждого конкретного метода, так и для всего bean в целом. Уровни изоляции транзакций определяются в терминах решения стан­дартных проблем, возникающих при параллельном доступе к данным. Кроме того, уровни изоляций транзакций зависят от того, какой тип JDBC драйвера используется в EJB.
<transaction-attr value> — параметр value может принимать одно из
нескольких значений TX_MANDATORY. Значение атрибута TX_MANDATORY указывает контейнеру, как вызывается метод bean. Если клиент вызывает метод без указания контекста транзакции, кон­тейнер генерирует исключительную ситуацию javax.jts.TransactionRe­quiredException. Контекст транзакции описывается в любом EJB-объек­те. Этот параметр используется, если метод bean должен вызываться текущей транзакцией.
TX_NOT_SUPPORTED — данное значение определяет, что вызыва-
емый метод не использует содержимое транзакции, контейнер создает новый поток для создания транзакции.
TX_SUPPORTS — значение атрибута, указывает контейнеру, как
вызывается конкретный метод в пределах транзакции.
TX_REQUIRES_NEW — значение указывает контейнеру на необхо-
димость обязательного создания нового контекста окружения.
TX_REQUIRED — данное значение атрибута определяет окружение
транзакции. Для каждого вызова клиентом метода определяется кон­текст транзакции. Если используется контекст транзакции клиента, то контейнер использует значения этого контекста. Если клиент вызывает метод, не описанный в контексте транзакции, то контейнер создает но­вое окружение.
TX_BEAN_MANAGED. Значение атрибута TX_BEAN_MANAGED
указывается индивидуально для session bean и не используется для ме­тодов session bean. Указанное значение для stateful session bean уста­навливается EJB-сервером. Метод, начавший транзакцию, должен пол­ностью завершить транзакцию, вернуть значение commit или rollback.
<isolation-level value> — атрибут, указывающий уровень, использу-
емый в каждом контейнере для изоляции одной транзакции от другой. Атрибут устанавливается для Enterprise bean или для каждого метода в отдельности. Если метод описан с различными уровнями изоляции, контейнер вызывает исключительную ситуацию java.rmi.RemoteExcep­tion.
Параметр value может принимать ряд значений. SERIALIZABLE. Значение SERIALIZABLE для указанного атрибута
запрещает чтение данных их строки основной базы данных, пока пер­вая из обратившихся транзакций не пройдет полностью или не откатит­ся. Это необходимо при нескольких различных вариантах работы с дан-
230 Часть 4. Распределенные компненты EJB
ными. Во-первых, может возникнуть ситуация, когда одна транзакция читает строку, вторая может изменить ту же самую строку. Тогда пер­вая транзакция получает различные значения. Способ называется «не повторяемое чтение» (Nonrepeatable reads). Во-вторых, использование SQL-оператора SELECT с параметром WHERE в момент считывания данных одной транзакцией может привести к неправильным результа­там, поскольку вторая транзакция обновила данные в считанных стро­ках (Phantom reads). И наконец, иногда первая транзакция читает дан­ные не полностью прошедшей второй транзакции (Dirty reads). Для предотвращения совместного доступа к ресурсам, хранящимся в базе данных, устанавливаются соответствующие значения атрибута.
REPEATABLE_READ — представляет более гибкую возможность
работы с транзакциями, чем SERIALIZABLE. Указанный атрибут по­зволяет транзакциям использовать dirty reads nonrepeatable reads, но запрещает использование phantom reads.
READ_COMMITTED — на этом уровне транзакции запрещено dirty
reads, но можно использовать nonrepeatable reads и phantom reads.
READ_UNCOMMITTED — предназначен для транзакций, деятель-
ность которых не повлияет на данные, хранящиеся в базе данных. То есть можно использовать все три уровня доступа: dirty reads, nonrepea­table reads и phantom reads.
Следует заметить, что, чем выше уровень блокировки, тем медлен-
нее выполняется запрос. Это обстоятельство необходимо учитывать для приложений, критичных ко времени исполнения.
Обеспечение безопасности выполнения описывается в теге <run-as-
mode value>. Значение value может принимать несколько различных переменных, каждая из которых обеспечивает собственный уровень безопасности.
CLIENT_IDENTITY — сервис безопасности EJB-сервера не получа-
ет дополнительных указаний относительно исполняемого bean.
SYSTEM_IDENTITY — используются специальные распоряжения
EJB-серверу об обеспечении дополнительных способов защиты.
SPECIFIED_IDENTITY — самый высокий уровень безопасности.
Специальные свойства EJB-контейнером определяются для исполняе­мого Enterprise bean.
<run-as-id> — с помощью тега определяются идентификаторы вы-
зовов методов и Enterprise bean.
<method-control> — тег, указывающий атрибуты безопасности вы-
полнения для каждого метода.
<dependency> — описывает полные имена классов, от которых зави-
ñèò Enterprise bean.
<env-setting> — в теге описываются системные переменные и их
значения. Имя системной переменной указывается с именем атрибута.
Ну и конечно же надо описать источник базы данных. Необходимо
указать три обязательных элемента:
URL источника данных. jdbc:DB2:sample;
Jndi-имя источника данных. sample;
Имя класса jdbc-драйвера. COM.ibm.db2.jdbc.app.DB2Driver.