Присвоение имен JNDI в Apache Geronimo и пулы подключений ресурсов Java, Часть 1: Подключение к источникам данных

Используйте JNDI, чтобы обращаться к пулам подключений к источниками данных, Java-сервисам обмена сообщениями, почтовым сессиям и URL соединениям

Java™Naming and Directory Interface (JNDI) используется в качестве интерфейса к пулам подключений в сервере приложений Apache Geronimo. Через этот интерфейс разработчики имеют доступ ко всем Java-объектам, включая Enterprise Java Beans (EJBs). Данный цикл статей предоставляет подробную информацию по использованию JNDI для обращения к пулам соединений с источниками данных, Java-сервисам обмена сообщениями, почтовым сессиям и URL-соединениям.

Дэйл де лос Рейес, автор, внештатный писатель

Дэйл де лос Рейес (Dale de los Reyes) закончил в 1996 году Калифорнийский Политехнический Государственный Университет с дипломом специалиста по вычислительной технике. Его опыт работы включает разработку приложений на J2EE, C++ для Microsoft® Windows® и COBOL для центральных ЭВМ. В свободное время он фотографирует, упражняется в боевых искусствах и занимается независимыми проектами.



31.07.2007

Знакомимся с JNDI

JNDI - это API-интерфейс или библиотека, которая обеспечивает приложения методами для связывания имен с объектами и поиска этих объектов в каталоге. Данная статья, первая в цикле, дает понимание того, как взаимосвязаны Apache Geronimo, JNDI и пулы соединений источников данных, как создать соединение с источником данных, а затем обратиться к нему в простом приложении Geronimo - которое называется утилита Customer Service - с использованием JNDI.

Понятие Источник данных относится к объекту, или фабрике, которые создают соединение с фактическим источником данных (обычно базой данных) внутри приложения. На платформе Java Enterprise Edition (Java EE) это понятие относится к пулу соединений с базой данных - группе легко доступных соединений с базой данных. Причиной для создания пула подключений к источникам данных или базам данных является то, что он увеличивает производительность приложения, так как открытие даже единственного соединения сильно загружает центральный процессор.

Утилита Customer Service (доступная в разделе Загрузка данной статьи) является простым Web-приложением, которое позволяет сохранять основную информацию о клиентах в базу данных. Вы можете собрать ее, используя Apache Ant 1.6.5 и Java 1.4.2_10, развернуть в Geronimo 1.1 с помощью Tomcat, используя базу данных Apache Derby, которая поставляется в комплекте с Geronimo (см. ссылку для загрузки Geronimo в разделе Ресурсы в конце статьи). Следующий раздел освещает, как создать эту базу данных и источник данных, используя консоль Geronimo.


Настройка Geronimo

Консоль Geronimo обеспечивает удобный для пользователя способ управления компонентами Java EE. После запуска Geronimo вы получите к нему доступ по адресу http://localhost:8080/console. system и manager - это установленные по умолчанию имя пользователя и пароль соответственно.

Чтобы взяться за дело:

  1. Нажмите ссылку DB Manager в нижней левой части Навигационной панели консоли. Появится администратор баз данных Derby.
  2. Создайте базу данных Customer Service, введя CustomerServiceDatabase в поле Create DB, затем нажмите кнопку Create.
  3. Создайте таблицу базы данных, выбрав CustomerServiceDatabase из ниспадающего меню Use DB.
  4. Вставьте содержимое SQL кода, из листинга 1, в таблицу и нажмите кнопку Run SQL. SQL-код в листинге 1 включен в файл с исходным кодом программы.
Листинг 1. SQL код
CustomerService-Part1.sql
create table customers (
   customerid varchar(10) primary key,
   fullname varchar(30),
   emailaddress varchar(30),
   interests varchar(100)
);
insert into customers values ('A100','John Doe10','Doe10@work.com','Java,Open Source, 
Computer Graphics');
insert into customers values ('b100','Jane Doe20','Doe20@home.net','Budget Travel, New 
Zealand, Martial Arts');

Теперь база данных Customer Service должна быть создана в Derby. Здесь только одна таблица, Customers, состоящая из двух записей. Рисунок 1 показывает, как выглядит правильно созданная таблица после нажатия сначала ссылки Application, а затем ссылки View Contents.

Рисунок 1. База данных Customer Service после инициализации
База данных Customer Service после инициализации

Далее вы создаете пул соединений для недавно созданной базы данных:

  1. Нажмите ссылку Database Pools в навигационной панели Консоли слева.
  2. Затем нажмите ссылку Using the Geronimo database pool wizard и выполните следующие действия:
    • На странице под названием Шаг 1: Выбор имени и базы данных введите CustomerServicePool в поле Name of Database Pool. Выберите Derby embedded из ниспадающего меню Database Type и нажмите Next.
    • На странице под названием Шаг 2: Выбор Driver, JAR, Parameters, выберите org.apache.derby/derby/10.1.1.0/jar из ниспадающего меню Driver JAR. В поле DB User Name введите app. Поле DB Password оставьте пустым. Введите CustomerServiceDatabase в поле Database и нажмите Next.
    • На странице под названием Шаг 3: Завершающая конфигурация пула убедитесь, что поле Driver Status показывает Loaded Successfully. Поле Connection Pool Parameters может оставаться пустым. Нажмите кнопку Test Connection, чтобы перейти к следующей странице.
    • На странице под названием Шаг 4: Тестирование соединения поле Test Result должно показывать Connected to Apache Derby 10.1.1.0. Нажмите Deploy. Рисунок 2 показывает недавно созданный пул соединений.
Рисунок 2. Недавно созданный источник данных CustomerServicePool
Недавно созданный источник данных CustomerServicePool

К этому времени база данных (CustomerServiceDatabase) и источник данных (CustomerServicePool) должны быть сконфигурированы и развернуты в Geronimo и готовы к использованию. Далее посмотрим, как объявить эти объекты в JNDI .


Создание дескрипторов развертывания Geronimo

Любой компонент, развернутый в Geronimo, нуждается в дескрипторах развертывания. Даже ранее созданный CustomerServicePool использует файл дескриптора, что подтверждается кнопкой Show Plan на странице под названием Шаг 4: Тестирование соединения. Наиболее распространенные компоненты, которые создает большинство разработчиков, это EJB (JAR-файлы), Web-архивы (WAR-файлы) и архивы приложений (EAR-файлы). Утилита Customer Service использует каждый из этих видов компонентов.

Конфигурирование файлов дескриптора важно, так как это механизм, позволяющий использовать эти компоненты в Geronimo. Он связывает имя JNDI с данным Java объектом. Компоненты, развернутые в Geronimo, обычно имеют два файла развертывания: стандартный дескриптор развертывания Java и специальный план развертывания Geronimo. Основным ресурсом является CustomerServiceDatabase. Источник данных, CustomerServicePool, предоставляет некоторое количество соединений для доступа к этой базе данных. Чтобы сохранить информацию о клиентах, пользователь обращается к Web-интерфейсу и вводит информацию в поля. Эти поля передаются в компонент Java (bean), который ссылается на сессионный компонент (session bean). Сессионный компонент создает ссылку на информацию о пользователе в entity-компонент (сущностный компонент), что позволяет ему выполнять основные операции базы данных. Entity-компонент - это Java-объект, представляющий одну строку в таблице клиентов, а также компонент, ссылающийся на CustomerServicePool для доступа к базе данных. Листинг 2 содержит стандартный Java-дескриптор развертывания для этого компонента.

Листинг 2. Частичный листинг CustomerEJB-ejb.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" 
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">

	<ejb-jar>
	 <enterprise-beans>
  <entity>
         <ejb-name>CustomerEntityBean</ejb-name>
         <home>com.service.customer.ejb.CustomerHome</home>
         <remote>com.service.customer.ejb.Customer</remote>
         <ejb-class>com.service.customer.ejb.CustomerEntityBean</ejb-class>
         <persistence-type>Container</persistence-type>
         <resource-ref>
            <res-ref-name>jdbc/CustomerServiceDataSource</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
         </resource-ref>
      </entity>
   </enterprise-beans>
</ejb-jar>

Здесь нас интересует четыре тега. Тег <ejb-name> задает имя entity-компонента. Тег <persistence-type> указывает, что этот компонент использует управляемую контейнером персистентность (CMP). Это означает, что все операции базы данных автоматически выполняются Geronimo. Тег <res-ref-name> задает JNDI-имя, которое будет использоваться при поиске. Реализация entity-компонента с использованием CMP минимальна, и никакого JNDI-поиска явно не запрограммировано. Однако объявление в теге <res-ref-name> все-таки требуется. Наконец, тег <res-type> указывает, какой тип объектов ассоциируется с именем JNDI. Листинг 3 показывает сопровождающий специальный файл Geronimo для entity-компонента.

Листинг 3. Частичный листинг CustomerEJB-openejb.xml
<?xml version="1.0" encoding="UTF-8"?>

<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
          xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
   <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
      <dep:moduleId>
         <dep:groupId>default</dep:groupId>
         <dep:artifactId>CustomerEJB</dep:artifactId>
         <dep:version>1.0</dep:version>
         <dep:type>jar</dep:type>
      </dep:moduleId>

      <dep:dependencies>
         <dep:dependency>
            <dep:groupId>console.dbpool</dep:groupId>
            <dep:artifactId>CustomerServicePool</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>rar</dep:type>
         </dep:dependency>
      </dep:dependencies>

      <dep:hidden-classes/>
      <dep:non-overridable-classes/>
   </dep:environment>

   <cmp-connection-factory>
      <resource-link>CustomerServicePool</resource-link>
   </cmp-connection-factory>

   <enterprise-beans>
      <entity>
         <ejb-name>CustomerEntityBean</ejb-name>
         <jndi-name>CustomerRemoteEntity</jndi-name>

         <resource-ref>
            <ref-name>jdbc/CustomerServiceDataSource</ref-name>
            <resource-link>CustomerServicePool</resource-link>
         </resource-ref>
      </entity>
   </enterprise-beans>
</openejb-jar>

Значение <ejb-name> должно соответствовать значению <ejb-name> в сопровождающем файле дескриптора. Тег <jndi-name> задает имя JNDI, которое будут использовать только клиенты приложения. Эти клиенты не прилагаются к файлу архива приложения (.ear). Тег <ref-name> соответствует имени JNDI в теге <res-ref-name> листинга 2. Тег <resource-link> связывает CustomerServicePool, созданный в консоли Geronimo с именем в <ref-name>.

Следует отметить, что формат специальных дескрипторов развертывания Geronimo изменился с версией 1.1. В предыдущей версии использовались атрибуты configID и parentID в заголовке для задания идентификатора и зависимости объекта. Этот формат теперь заменен структурой moduleId, согласованной со стилем присвоения имен в Apache Maven. Он состоит из четырех элементов следующего образца: groupID/artifactID/version/type. Эта модель именования соответствует структуре развертывания в geronimo-1.1/repository.

Теги <dep:XXX> в приведенном выше файле дескриптора соответствуют этому соглашению. Например, зависимость, CustomerServicePool, расположена в репозитории Geronimo в console/dbpool/CustomerServicePool/1.0. Это новое соглашение означает, что приложения, развернутые в Geronimo 1.0 должны быть модернизированы. В руководстве пользователя 1.1 есть раздел о том, как это делается. Однако будущие выпуски Geronimo будут поддерживать это соглашение, поэтому приложения, развернутые в версии 1.1, должны разворачиваться в будущих версиях без модернизации дескрипторов.

Теперь продолжим конфигурировать сессионный компонент в листинге 4.

Листинг 4. Частичный листинг ProcessCustomerEJB-ejb.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 
2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>
   <enterprise-beans>
      <session>
         <ejb-name>ProcessCustomerSessionBean</ejb-name>
         <home>com.service.customer.ejb.ProcessCustomerHome</home>
         <remote>com.service.customer.ejb.ProcessCustomer</remote>
         
<ejb-class>com.service.customer.ejb.ProcessCustomerSessionBean</ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>

         <ejb-ref>
            <ejb-ref-name>ejb/CustomerEntityBean</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <home>com.service.customer.ejb.CustomerHome</home>
            <remote>com.service.customer.ejb.Customer</remote>
         </ejb-ref>
      </session>
   </enterprise-beans>
</ejb-jar>

Тег <ejb-name> задает имя сессионного компонента - ProcessCustomerSessionBean. Тег <ejb-ref-name> задает имя JNDI, которое будут использовать компоненты приложения. В данном случае, сессионный компонент будет выполнять поиск по entity-компоненту. Соответствующий специальный план Geronimo показан в листинге 5.

Листинг 5. Листинг ProcessCustomerEJB-openejb.xml
<?xml version="1.0" encoding="UTF-8"?>

<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
        xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1"
        xmlns:security="http://geronimo.apache.org/xml/ns/security-1.1"
        xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
   <dep:environment>
      <dep:moduleId>
         <dep:groupId>default</dep:groupId>
         <dep:artifactId>ProcessCustomerSessionBean</dep:artifactId>
         <dep:version>1.0</dep:version>
         <dep:type>jar</dep:type>
      </dep:moduleId>

      <dep:dependencies/>
      <dep:hidden-classes/>
      <dep:non-overridable-classes/>
   </dep:environment>

   <enterprise-beans>
      <session>
         <ejb-name>ProcessCustomerSessionBean</ejb-name>
         <jndi-name>ProcessCustomerRemoteSessionBean</jndi-name>

         <ejb-ref>
            <ref-name>ejb/CustomerEntityBean</ref-name>
            <ejb-link>CustomerEntityBean</ejb-link>
         </ejb-ref>
      </session>
   </enterprise-beans>
</openejb-jar>

Тег <dep:moduleId> задает полное имя этого компонента. Подобно entity-компоненту, тег <ejb-name> должен соответствовать тегу <ejb-name> в стандартном дескрипторе из предыдущего листинга. А тег <jndi-name> содержит имя JNDI, используемое только клиентами приложения. Наконец, тег <ejb-ref> связывает имя JNDI с именем EJB. Далее следует Web-архив, и он ссылается на сессионный компонент из Java-компонента. Его стандартный дескриптор развертывания показан в листинге 6.

Листинг 6. Частичный листинг web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         version="2.4">

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <ejb-ref>
    <ejb-ref-name>ejb/ProcessCustomerSessionBean</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <home>com.service.customer.ejb.ProcessCustomerHome</home>
    <remote>com.service.customer.ejb.ProcessCustomer</remote>
  </ejb-ref>
</web-app>

Обратить внимание следует прежде всего на тег <ejb-ref>. Он показывает как объявлять имя JNDI, которое будет использоваться для поиска сессионного компонента.

Специальный план Geronimo для Web-архива совершенно простой. Он определяет полное имя Web-архива и задает контекстный корень, в котором может быть найдено приложение при доступе из Web-браузера (см. листинг 7).

Листинг 7. Листинг geronimo-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"
         xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
   <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
      <dep:moduleId>
         <dep:groupId>default</dep:groupId>
         <dep:artifactId>CustomerService-web</dep:artifactId>
         <dep:version>1.0</dep:version>
         <dep:type>war</dep:type>
      </dep:moduleId>

      <dep:dependencies/>
      <dep:hidden-classes/>
      <dep:non-overridable-classes/>
   </dep:environment>

   <context-root>/service</context-root>
</web-app>

Утилита Customer Service развернута как .ear файл. Поэтому она имеет два файла дескриптора, application.xml и geronimo-application.xml. Однако ни один из этих файлов не содержит объявлений JNDI, поэтому здесь они не рассматриваются. Вот и все, что нужно, чтобы объявить JNDI-имена и привязать их к EJB-компонентам! Следующий раздел освещает, как находить эти объекты в коде.


Утилита Customer Service

Утилита Customer Service почти готова. Следующим шагом будет вызвать эти EJB, используя JNDI для доступа к базе данных. Полные строки JNDI отвечают соглашению присвоения имен, как показано в листинге 8.

Листинг 8. Листинг JNDI-имен в customer.properties
# Specify!!!!! JNDI names here
jndi.customer.ejb=java:/comp/env/ejb/CustomerEntityBean
jndi.process.ejb=java:/comp/env/ejb/ProcessCustomerSessionBean

Имена, объявленные ранее в теге <ejb-ref-name> EJB-дескрипторов, теперь показаны в полном контексте JNDI-имени. В соответствии с соглашением именования объекты должны следовать за соответствующими доменами. Отсюда, сессионные и entity-компоненты сопровождаются приставкой ejb/. CustomerServiceDataSource, объявленный в файле дескриптора entity-компонента, использует jdbc/, так как он относится к базе данных. Код в листинге 9 показывает, как производить JNDI-поиск CustomerEntityBean из сессионного компонента, используя полное имя.

Листинг 9. Частичный листинг ProcessCustomerSessionBean.java
package com.service.customer.ejb;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

public class ProcessCustomerSessionBean implements SessionBean
{
   private ResourceBundle    bundle = null;
   private SessionContext    context = null;
   private CustomerHome      customerHome = null;
   private String            JNDI_CUSTOMER_EJB = null;

   // Create method(s)
   public void ejbCreate()
      throws CreateException
   {
      try
      {
         doJNDILookups();
      } // end try

      catch (Exception e)
      {
         throw new CreateException("ejbCreate: " + e.getMessage());
      } // end catch
   } // end ejbCreate

   // Support methods
   private void doJNDILookups()
      throws NamingException, ClassCastException
   {
      Object objref = null;
      InitialContext initial = null;

      bundle = ResourceBundle.getBundle("customer", Locale.getDefault(), 
ProcessCustomerSessionBean.class.getClassLoader());
      JNDI_CUSTOMER_EJB = bundle.getString("jndi.customer.ejb");

      initial = new InitialContext();
      objref = initial.lookup(JNDI_CUSTOMER_EJB);
      customerHome = (CustomerHome)PortableRemoteObject.narrow(objref, 
CustomerHome.class);
      System.out.println("looking up: " + JNDI_CUSTOMER_EJB);
   } // end doJNDILookups
} // end ProcessCustomerSessionBean

Основным элементом, интересующим нас в листинге 9, является метод doJNDILookups. Во-первых, полное имя JNDI получается из файла customer.properties. Далее, создается InitialContext и производится поиск по JNDI-имени. Наконец, узкий метод проверяет, может ли полученный объект из JNDI быть отнесен к намеченному типу объектов, CustomerHome. Листинг 10 показывает, как выполняется поиск из компонента Java.

Листинг10. Частичный листинг CustomerServiceJavaBean.java
public class CustomerServiceJavaBean
{
   private ProcessCustomerHome processHome = null;
   private ResourceBundle      bundle = null;
   private String              JNDI_PROCESS_EJB = null;

   public CustomerServiceJavaBean()
   {
      InitialContext initial = null;
      Object objref = null;

      bundle = ResourceBundle.getBundle("customer", Locale.getDefault(), 
CustomerServiceJavaBean.class.getClassLoader());
      JNDI_PROCESS_EJB = bundle.getString("jndi.process.ejb");

      try
      {
         initial = new InitialContext();
         objref = initial.lookup(JNDI_PROCESS_EJB);
         processHome = (ProcessCustomerHome)PortableRemoteObject.narrow(objref, 
ProcessCustomerHome.class);
         System.out.println("looking up: " + JNDI_PROCESS_EJB);
      } // end try

      catch (Exception e)
      {
         e.printStackTrace();
      } // end catch
   } // end CustomerServiceJavaBean
} // end CustomerServiceJavaBean

Шаги для поиска ProcessCustomerSessionBean похожи на поиск entity-компонента. Только теперь JNDI-имя другое, а для подтверждения найденного объекта из JNDI используется класс ProcessCustomerHome.

Теперь утилита Customer Service готова для развертывания в Geronimo:

  1. Измените файл CustomerService/resources/build.properties, и убедитесь, что местонахождение директорий определено правильно.
  2. Далее откройте консоль и измените директории на местонахождение CustomerService/build.xml. Затем введите ant. Это создаст и развернет приложение, к которому можно обратиться по адресу http://localhost:8080/service.

Рисунок 3 показывает, как выглядит страница ввода данных.

Рисунок 3. Страница ввода данных для утилиты Customer Service
Страница ввода данных для утилиты Customer Service

На этой стадии в базе данных сохраняется только самая важная информация о клиентах.

Есть один последний вопрос, на который следует обратить внимание. Разработчики могут столкнуться с ошибкой SQL Exception, пытаясь обратиться к утилите Customer Service после получения доступа к базе данных Derby из консоли Geronimo, или наоборот. Перезагрузка Geronimo исправит ошибку один раз, но затем снова выдаст exception при другой попытке обратиться к базе данных. Это проблема относится к условию, описанному в Учебном пособии пользователя по Geronimo 1.1 в конце раздела (см. ссылку в Ресурсах).

Это условие вызывается, когда пул соединений базы данных имеет зависимость от драйверов Derby (org.apache.derby/derby/10.1.1.0/jar) или Derbynet (org.apache.derby/derbynet/10.1.1.0/jar). Сохранение зависимости как таковой загрузит вторую копию Derby во втором загрузчике класса, что вызовет SQL Exception. Мастер пулов базы данных Geronimo создаст план, имеющий эту зависимость, когда используется Derby embedded. В качестве альтернативы можно вырезать и вставить сгенерированный план и развернуть его как часть архива приложения. Таким образом, пул базы данных становится индивидуальным только для утилиты Customer Service. Существующие планы дескриптора потребуют модификации, и в последующих листингах, начиная с листинга 11, выделяются эти изменения.

Листинг 11. Модифицированный CustomerServicePool-alt.xml
<dep:moduleId>
    <dep:groupId>default</dep:groupId>
    <dep:artifactId>CustomerServicePool</dep:artifactId>
    <dep:version>1.0</dep:version>
    <dep:type>rar</dep:type>
</dep:moduleId>

Сгенерированный план получен из мастера пулов базы данных. На странице под названием Шаг 4: Тестирование соединения нажмите кнопку Show Plan вместо Deploy. После того, как сгенерированный план будет вырезан, вставлен и сохранен в другом файле, например, CustomerServicePool-alt.xml, тег <groupId> должен быть изменен, чтобы соответствовать содержимому листинга 11, так как теперь CustomerServicePool будет развертываться как часть приложения. Теперь этот тег <groupId> будет соответствовать тегу <groupId> в geronimo-application.xml, который частично отображен в листинге 12.

Листинг 12. Альтернативный geronimo-application.xml
<module>
    <connector>tranql-connector-1.2.rar</connector>
    <alt-dd>CustomerServicePool-alt.xml</alt-dd>
</module>

Дескриптору geronimo-application.xml понадобится дополнительный тег из листинга 12. Это также касается стандартного application.xml, показанного в листинге 13.

Листинг 13. Альтернативный application.xml
<module>
    <connector>tranql-connector-1.2.rar</connector>
</module>

Этот дополнительный тег также необходим в application.xml для альтернативного развертывания. Листинг 14 показывает измененный код, требуемый в дескрипторе, CustomerEJB-openejb.xml.

Листинг 14. Модифицированный CustomerEJB-openejb.xml
<dep:dependencies/>

Существующий тег <dependencies> на CustomerServicePool может быть заменен кодом, показанным в листинге 14.

Наконец, драйвер tranql и измененный план пула базы данных должны быть привязаны на одном уровне как JAR и WAR-файлы внутри архива приложения (.ear файл). Драйвер tranql поставляется в комплекте с Geronimo и расположен в папке репозитория C.


Заключение

Надеемся, что первая статья этой серии помогла вам понять одно из наиболее распространенных JNDI-соединений - доступ к пулу базы данных из EJB. Вы узнали, как использовать консоль Geronimo, чтобы инициализировать базу данных и конфигурировать пул соединений базы данных. Наконец, утилита Customer Service показала вам, как можно получить доступ к этому пулу соединений из кода. В следующей статье данного цикла речь пойдет о JNDI-соединениях с JMS-ресурсом и об их использовании для совершенствования нашего учебного приложения.


Загрузка

ОписаниеИмяРазмер
Исходный текст программы, Часть 1CustomerService-part1.zip57KB

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Технология Java, WebSphere
ArticleID=243923
ArticleTitle=Присвоение имен JNDI в Apache Geronimo и пулы подключений ресурсов Java, Часть 1: Подключение к источникам данных
publish-date=07312007