Разработка контента курса дистанционного обучения "DB2 универсальная база данных", страница 21

Таблица 2.3 (продолжение)

Replicator.java

courseExample/Replicator.class

Remote-интерфейс EJB-компонента

ReplicatorBean.java

courseExample/ReplicatorBean.java.class

Принимает массив объектов Row, запрашивает соединение с DB2, выполняет SQL-запросы и помещает результаты в журнал репликации

Journal.java

Journal.class

Сервлет. Пользовательский интерфейс журнала репликации

2.7.5. Описание программных модулей

Стартовая страница index.jsp предоставляет пользователю HTML-форму для загрузки XML-документа. Эта страница показана на рисунке 2.80:

Рис. 2.80 Стартовая страница приложения

Форму обслуживает сервлет XMLReceiver. Если клиентом является не пользователь, а другое приложение, то это приложение должно самостоятельно сформировать multipart HTTP-запрос напрямую к сервлету XMLReceiver (минуя index.jsp). XMLReceiver лишь принимает запрос и отображает результат последующих операций. Вспомогательный для XMLReceiver класс MultiPartParser обрабатывает все части multipart запроса, которые являются файлами, полагая, что все они XML-файлы. Таким образом, в одном запросе к серверу для репликации можно передать несколько XML-документов. Но в данном приложении для простоты пользователю дана возможность загрузить лишь один документ через HTML-форму. Для приложения-клиента это ограничение не действует. Классы RowSet и Row совместно создают SQL-оператор для соответствующей строки XML-файла. Оператор хранится в свойстве класса Row, которое называется sql. Для получения доступа к EJB-компоненту ReplicatorBean классом MultiPartParser используется контекст JNDI, создаваемый сервером WebSphere. EJB-компонент должен быть опубликован в контексте и иметь JNDI-имя "REPLICATOR". В качестве параметра EJB-компоненту передается массив объектов Row, точнее Java-контейнер ArrayList, содержащий эти объекты. Для того чтобы использовать класс Row в качестве параметра EJB этот класс реализует Java-интерфейс Serializable. ReplicatorBean представляет собой простейший EJB - SessionBean без состояния. Для соединения с DB2 ReplicatorBean использует разделяемый пул соединений. При работе с современными СУБД и J2EE серверами нет необходимости самому программно реализовывать возможности такого пула соединений. Эту задачу решает СУБД и сервер приложений. DB2 предоставляет реализацию java-интерфейса javax.sql.ConnectionPoolDataSource (класс COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource), а сервер WebSphere используя этот класс, создает пул соединений - WebSphere ресурс DataSource (источник данных). Имя пользователя и пароль для доступа к DB2 можно указать единожды при создании в DataSource. EJB-компонент в свою очередь тоже использует JNDI - для получения доступа с объекту DataSource. Для нужд данного приложения DataSource должен быть опубликован в контексте, и иметь JNDI-имя "DOROGADB". Для прикладного программиста разница в прямом использовании JDBC -драйвера и объекта DataSource ощутима только в коде запроса соединения. Вот как выглядит код, использующий JDBC -драйвер DB2 напрямую:

import java.sql.DriverManager;

import java.sql.Connection;

import java.sql.Statement;

...

try{

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver")

          Connection conn=DriverManager.getConnection("jdbc:db2:DOROGADB","uid","pwd");

          Statement stm = conn.createStatement();

          ...

} catch (Exceptin ex){

          ex.printStackTrace(System.out);

}

А вот как выглядит код, использующий пул соединений и JNDI:

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

imort javax.sql.DataSource;

import java.sql.Connection;

import java.sql.Statement;

...

try{

            Context ctx = new InitialContext();

            Object ref = ctx.lookup("DOROGADB");

          DataSource ds = (DataSource)ref;

            Connection conn = ds.getConnection();

          Statement stm = conn.createStatement();