Перейти к тексту

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

При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

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

  • Закрыть [x]

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

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

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

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

  • Закрыть [x]

Разработка приложений Apache Derby в Eclipse

Джилл Руа, Инженер-программист по управлению информацией, IBM
author
Джилл Руа (Gilles Roux) является инженером-программистом по управлению информацией в организации IBM DB2. Его главной задачей является разработка инструментальных средств миграции баз данных.

Описание:  Разработка приложений Apache Derby включает в себя множество задач, таких как создание и подключение к базе данных, написание клиентского приложений Java™ Database Connectivity (JDBC) и встроенных процедур, развертывание полученных отдельных частей в производственной среде. Узнайте, как можно совместно использовать различные основанные на Eclipse инструментальные средства Apache Derby для облегчения процесса разработки.

Дата:  20.01.2005
Уровень сложности:  средний
Активность:  5442 просмотров
Комментарии:  


Обзор

В этой статье рассмотрен процесс разработки приложения Apache Derby в интегрированной среде разработчика Eclipse (IDE) с использованием нескольких инструментальных средств, включая Java-инструменты разработки, подключаемые модули IBM® DB2® для Eclipse и подключаемый модуль IBM Integration для Derby.

Пройдите полный цикл разработки типичного приложения Derby, начиная с создания базы данных, переходя к разработке клиентского приложения JDBC, разработке функций и встроенных процедур, и, наконец, к развертыванию решения. Также узнайте, как можно заменить базу данных Apache Derby базой данных DB2 Universal Database (UDB).

В этой статье предполагается, что вы обладаете базовыми знаниями по базе данных Apache Derby, по платформе Eclipse и подключаемым модулям DB2 для Eclipse. Я настоятельно рекомендую прочесть статью из двух частей "Использование подключаемых модулей DB2 для Eclipse с Apache Derby", ссылка на которую приведена в разделе "Ресурсы".

Для иллюстрации различных задач, включенных в процесс разработки приложений, вам предоставляются конкретные примеры и пошаговые инструкции по созданию примера приложения. В этом примере мы хотим разработать приложение командной строки для инвентаризации книжного магазина. В базе данных хранятся записи о различных книгах и их доступном количестве.

С этим новым приложением вы можете изменить количество данных. Например, если от поставщика был получен набор книг, это приложение будет использовано для увеличения количества книг, находящихся в базе. Если количество увеличивается или падает до определенного предела, об этом по электронной почте получает уведомление менеджер, для того чтобы выполнить определенное действие.


Среда разработки

Инструментальные средства

Java Development Tools (JDT) - это набор подключаемых модулей, встраиваемых в Eclipse и позволяющих редактировать, компилировать, отлаживать и развертывать Java-приложения общего назначения.

Подключаемый модуль DB2 для Eclipse предоставляет возможность подключения к различным базам данных, включая IBM Cloudscape и Apache Derby. Этот модуль состоит из следующих компонент:

  • Connection Wizard: Создает соединение с базами данных DB2, Cloudscape или Derby
  • Database Explorer View: Просматривает объекты базы данных
  • SQL Scrapbook: Редактирует и выполняет одиночные SQL-команды
  • Database Output View: Отображает содержимое таблицы или результат выполнения SQL-команды
  • Migration Wizard: Выполняет автоматическую миграцию существующей базы данных Derby в DB2 UDB

Подключаемый модуль IBM Integration для Derby интегрирует много полезных средств Derby в среду Eclipse. Основными предоставляемыми функциональными возможностями являются:

  • Apache Derby Nature: Дает возможность проекту Eclipse выполнять задачи Derby
  • Network Server: Конфигурирует и запускает Derby Network Server непосредственно из проекта Eclipse
  • IJ: Запускает программу командной строки Derby непосредственно в консоли Eclipse либо в интерактивном, либо в пакетном режиме
  • Sysinfo: Отображает системную информацию Derby, относящуюся к проекту

Подключаемые модули DB2 для Eclipse и IBM Integration для Derby являются двумя независимыми инструментами, очень хорошо дополняющими друг друга. Первый обеспечивает общее соединение с базой данных, второй предоставляет доступ ко многим специфичным для Derby функциям. Многие задачи могут быть выполнены в любом из этих модулей. В данной статье будут упомянуты различные способы выполнения конкретной задачи, так что вы сможете выбрать предпочитаемый способ работы.

Установка инструментальных средств

Затем загрузите подключаемый модуль Apache Derby с Apache.org и установите его поверх предыдущей установки.

Настройка среды разработки

Как упоминалось ранее, вы будете использовать различные инструментальные средства для разработки вашего приложения: подключаемый модуль DB2 для Eclipse, подключаемый модуль IBM Integration для Derby и JDT. Все эти инструменты основаны на Eclipse, что позволяет им легко интегрироваться в единую среду разработки.

При разработке приложения вы обычно будете устанавливать несколько соединений с базой данных:

  • Просмотр базы данных в Database Explorer
  • Выполнение команд с использованием программы командной строки Derby IJ
  • Само приложение будет подключаться к базе данных при тестировании

База данных Derby может работать в нескольких конфигурациях. Простейшей является встраиваемая конфигурация, но она в данном случае не подходит, поскольку вам нужно установить соединения из нескольких инструментальных средств, выполняющихся на различных виртуальных машинах Java. Также и в рабочей среде вы, возможно, захотите подключаться к базе данных из различных приложений. Следовательно, используем конфигурацию Network Server. Подключаемый модуль IBM Integration для Derby может очень легко запустить Derby Network Server на локальной машине в каталоге проекта Eclipse. Затем сконфигурируйте приложение и другие средства для подключения к этому сетевому серверу. На следующем рисунке показана эта конфигурация.


Рисунок 1. Конфигурация среды разработки

Первым шагом для настройки среды разработки является создание вашего проекта. Выберите File->New->Project->Java Project и в качестве названия проекта введите bookstore. При этом создастся Java-проект и произойдет переключение в перспективу Java. Нажмите правой кнопкой мыши на проекте и выберите Apache Derby->Add Apache Derby nature. Это разрешит использование функциональных возможностей Apache Derby в вашем проекте и настроит путь Java-проекта так, чтобы приложение имело доступ к базе данных Derby и к драйверу JDBC.

К подключаемым модулям DB2 для Eclipse обычно обращаются из перспективы Data, которая не связана с конкретным проектом. Для упрощения процесса разработки и избежания переключения между перспективами Java и Data, добавьте виды подключаемых модулей DB2 в перспективу Java: в частности, вид Database Explorer и вид DB Output. Вы можете выполнить это при помощи меню Show View->Other. На следующем рисунке показана такая схема вашей среды разработки.


Рисунок 2. Схема среды разработки


Создание базы данных

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

Сначала запустите Derby Network Server, нажав правой кнопкой мыши на проекте и выбрав Apache Derby->Start Derby Network Server. Это необходимо делать каждый раз при запуске Eclipse. Зеленая стрелка на пиктограмме проекта указывает, что сервер запущен.

Создание базы данных

Создание базы данных очень похоже на подключение к существующей базе данных: включение атрибута create=true в URL указывает механизму базы данных на необходимость создания базы данных при первой попытке подключения к ней. Это может быть сделано при помощи Connection Wizard подключаемых модулей DB2 для Eclipse. В следующей таблице показаны параметры, которые должны быть использованы в мастере Connection Wizard.


Таблица 1. Параметры подключения
Connection name bookstoredb
Database Manager Apache Derby v10.0
JDBC Driver IBM DB2 UniversalНеобходимо для подключения к сетевому серверу
Database bookstoredbИмя создаваемой базы данных
Host localhostСетевой сервер выполняется на локальной машине
Port Number 1527Номер порта по умолчанию
Class Location например: C:\eclipse\plugins\com.ibm.cloudscape.ui_1.0.0\
db2jcc_license_c.jar;C:\eclipse\plugins\
com.ibm.cloudscape.ui_1.0.0 \db2jcc.jar
Create database if required yesНеобходимо для создания базы данных при первом подключении
UserID bookstoreАутентификация в базе данных не разрешена, поэтому может использоваться любое имя пользователя, но имя пользователя будет определять схему по умолчанию
Password aaaАутентификация в базе данных не разрешена, поэтому может использоваться любой пароль

Рисунок 3. Создание базы данных с использованием Connection Wizard

После окончания работы мастера создается база данных и в Database Explorer View добавляется соединение. База данных может просматриваться путем разворачивания узлов соединения, но на данном этапе они, естественно, пусты.

База данных создается в текущем каталоге сетевого сервера Derby, которым является каталог ранее созданного проекта Eclipse. Обновление проекта при помощи нажатия правой кнопки мыши по его имени и выбора пункта Refresh откроет новый каталог bookstoredb/, содержащий файлы для базы данных. Не пытайтесь менять эти файлы, поскольку база данных повредится.

Создание объектов базы данных

Следующим шагом является создание объектов базы данных, которые будут использоваться в приложении. Сейчас просто создайте таблицу при помощи SQL Scrapbook. SQL Scrapbook вызывается нажатием правой кнопки мыши в Database explorer и выбором Open SQL Scrapbook. Откроется новый редактор, в котором вы можете набрать SQL-команду для выполнения:


Листинг 1. Команда CREATE TABLE
                
create table books(
    id int,
    title varchar(128),
    author varchar(128),
    price decimal(6,2),
    quantity int,
    status int
)

Обратите внимание на то, что SQL Scrapbook может использоваться для выполнения только одной SQL-команды. Также не завершайте эту команду точкой с запятой. Вы можете нажать кнопку ?Execute SQL statement? на главной панели кнопок Eclipse. Вид DB Output должен показать, что команда выполнилась успешно. Вы можете также обновить соединение и проверить, что база данных теперь содержит новую созданную таблицу.


Рисунок 4. Создание таблицы при помощи SQL Scrapbook

Создание некоторых тестовых данных

Теперь заполните таблицу books некоторыми тестовыми данными, используя команды INSERT. Вы можете выполнить это при помощи SQL Scrapbook, но используйте функцию "Run SQL script using ij" подключаемого модуля IBM Integration для Derby. Эта функция дает возможность выполнить SQL-сценарий при помощи программы командной строки Derby и увидеть результат в окне Eclipse output view. Большим преимуществом данного метода является то, что он дает возможность выполнить одновременно несколько команд. Этот метод также требует включения в начало сценария команды подключения, что дает вам больший контроль над URL соединения.


Таблица 2. Отличия между SQL Scrapbook и IJ-сценарием
SQL Scrapbook Выполнение IJ-сценария
Команды хранятся в файле НетДа
Может выполнять несколько команд одновременно НетДа
Завершающий символ команд Завершающий символ не разрешенТочка с запятой
Функции редактирования Подсветка синтаксиса, контекстная помощьНет
Соединение с базой данных SQL scrapbook связан с текущим соединениемПервой командой должна быть команда подключения к желаемой базе данных

Легкий способ создания URL - это копирование URL, использовавшегося в мастере Connection Wizard: нажмите правой кнопкой мыши на соединении в окне просмотра базы данных, выберите Edit Connection и перейдите в поле Connection URL. Необходимо добавить имя пользователя и пароль в качестве URL-атрибутов.

Используйте Eclipse для создания в вашем проекте текстового файла с названием data.sql и введите в него следующие команды:


Листинг 2. Команды INSERT INTO
                
connect 'jdbc:derby:net://localhost:1527/bookstoredb:user=bookstore;password=aaa;';

insert into books values(1, 'East Of Eden', 'John Steinbeck', 7.20, 3, 0);
insert into books values(2, 'Hard-Boiled Wonderland and the End of the World',
    'Haruki Murakami', 10.50, 9, 0);
insert into books values(3, 'SQL for Dummies', 'Allen G. Taylor', 16.49, 6, 0);

disconnect;

Затем вы можете нажать правой кнопкой мыши на файле в Project Explorer и выбрать Apache Derby->Run SQL script using ij. В окне консоли Eclipse отобразится результат выполнения, который должен быть успешным. Вы можете затем выбрать таблицу в Database Explorer, и выбрать ?Sample Content? для проверки того, что данные были вставлены в таблицу.


Рисунок 5. Выполнение SQL-сценария для вставки данных


Написание приложение Derby Client JDBC

Загрузка JDBC-драйвера

JDBC-приложение может быть легко записано с использованием Eclipse JDT и JDBC-драйвера Derby. Сначала создайте класс Inventory в пакете bookstoreapp.clientside, использовав мастер JDT Class и добавив в него метод main(). JAR-файлы, содержащие JDBC-драйвер и классы Derby, уже записаны в classpath проекта, поскольку вы разрешили Derby nature.

Перед подключением к базе данных Derby необходимо загрузить соответствующий JDBC-драйвер, используя метод Class.forName(jdbcDriverClassName). При этом загрузится класс JDBC Driver, имя которого передается как аргумент, и он зарегистрируется для следующего JDBC-соединения.

В зависимости от конфигурации Derby может использоваться два различных JDBC-драйвера:


Таблица 3. JDBC-драйверы Derby
Конфигурация Встраиваемый серверСетевой сервер
Необходимые JAR-файлы derby.jardb2jcc.jar;db2jcc_license_c.jar
Имя класса org.apache.derby.jdbc.EmbeddedDrivercom.ibm.db2.jcc.DB2Driver

Пример основан на конфигурации с сетевым сервером, поэтому используйте JDBC-драйвер jcc. Если у вас есть сомнения, корректное имя класса может быть легко указано путем копирования имени класса из мастера Connection:


Листинг 3. Загрузка JDBC-драйвера jcc
                
Class.forName("com.ibm.db2.jcc.DB2Driver");

Подключение к базе данных

Для установки соединения с базой данных используется метод DriverManager.getConnection(url). Он принимает URL соединения и возвращает объект Connection, который может быть использован для запросов к базе данных.

Хорошим способом получения URL соединения является редактирование соединения с Derby в окне Database Explorer и копирование URL соединения, который автоматически создается из различных атрибутов соединения. По причинам безопасности имя пользователя и пароль здесь не отображаются, поэтому необходимо добавить их в конец URL вручную в коде приложения.


Рисунок 6. Использование мастера соединения для построения URL соединения

В конец URL могут быть добавлены также другие настройки. Например, настройка retrieveMessagesFromServerOnGetMessage=true указывает JDBC-драйверу извлекать сообщения об ошибках из сервера Derby, что очень полезно при отладке приложения, подключающегося к удаленной базе данных Derby.

В нашем примере установите соединение с Derby Database, используя следующий код:


Листинг 4. Соединение с базой данных
                
String url = "jdbc:derby:net://localhost:1527/bookstoredb";
url += ":user=bookstore;password=aaa;";		
url += "retrieveMessagesFromServerOnGetMessage=true;";
Connection con = DriverManager.getConnection(url);

Запрос к базе данных

После установки соединения можно выполнять запросы к базе данных, просто используя JDBC API. Например, вы можете создать объект Statement и использовать его для выполнения SQL-запроса к базе данных. Возвращаемый объект ResultSet используется для навигации по результату запроса:


Листинг 5. Выполнение запроса и навигация по полученному результату
                
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM bookstore.books");
while (rs.next()) {
    System.out.print(rs.getString(1) + ", ");
    System.out.print(rs.getString(2) + ", ");
    System.out.print(rs.getString(3) + ", ");
    System.out.print(rs.getString(4) + ", ");
    System.out.print(rs.getString(5) + ", ");
    System.out.println(rs.getString(6));
}
rs.close();
stmt.close();


Рисунок 7. Выполнение JDBC-приложения

Для получения дополнительной информации по использованию JDBC вы можете обратиться к учебникам по JDBC, перечисленным в разделе "Ресурсы" этой статьи.

Вы можете загрузить полный исходный код класса Inventory . Этот класс реализует простой текстовый интерфейс для получения списка книг и обновления количества указанной книги в базе данных.

Вот пример отображаемой приложением информации:


Рисунок 8. Пример отображаемой информации приложением Inventory


Написание Java-функций и процедур

JDBC-приложение, рассмотренное в предыдущем разделе, очень полезно для разработки пользовательского приложения. Однако реализация важной логики приложения на этом уровне может быть неудачной идеей, поскольку логика находится вне базы данных, что может сделать эту базу данных более уязвимой. Например, если другому JDBC-приложению требуется подключиться к этой же базе данных, необходимо, чтобы в нем была реализована точно такая же логика. Решением этой проблемы может быть реализация правил базы данных в самой базе данных через набор триггеров, хранимых процедур и функций.

Написание Java-кода

Поскольку Derby является базой данных, реализованной на языке Java, она не имеет собственного языка хранимых процедур/функций, а использует язык Java. Создание хранимой процедуры или функции (обобщенно называемых подпрограммами) Derby может быть сделано путем создания Java-метода и последующего объявления процедуры или функции Derby, основанной на Java-методе. Вызов Derby-подпрограммы будет вызывать инициирование работы Java-метода.

Для успешной инициации важно, чтобы объявления процедуры в Derby и Java соответствовали друг другу. В следующей таблице приводится отображение между возможностями Derby и Java, которые должны быть использованы.


Таблица 4. Отображение функциональных возможностей, используемых для написания Java-функций и процедур
DerbyJava
ПроцедураМетод public static без возвращаемого значения
ФункцияМетод public static с возвращаемым значением
Входной параметр (процедуры или функции)Параметр метода
Выходной параметр (процедуры)Параметр - одиночный массив
Входной/выходной параметр (процедуры)Параметр - одиночный массив
Возвращаемое значение (функция)Возвращаемое значение
Возвращаемый результат - SetДополнительный одиночный параметр java.sql.ResultSet[]

Таблица 5. Отображение типов, используемых для написания Java-функций и процедур
DerbyJava
SMALLINTshort
INTEGERint
BIGINTlong
DECIMAL(p,s)java.math.BigDecimal
REALfloat
DOUBLE PRECISIONdouble
CHAR(n)String
VARCHAR(n)String
LONG VARCHAR*unsupported*
CHAR(n) FOR BIT DATAbyte[]
VARCHAR(n) FOR BIT DATAbyte[]
LONG VARCHAR FOR BIT DATA*unsupported*
CLOB(n)*unsupported*
BLOB(n)*unsupported*
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp

По содержимому самого Java-метода ограничений нет, поэтому любой корректный Java-код может вызываться как процедура или функция Derby. Интересным приложением является установка JDBC-соединения с базой данных Derby (с использованием стандартного URL derby:default:connection) для запроса базы данных, инициировавшей вызов. Есть возможность соединиться с другой базой данных с использованием полного JDBC URL.

Для целей нашего приложения создайте класс DerbyFunctions в пакете bookstoreapp.serverside для хранения всех Java-методов, которые будут выполняться сервером базы данных. Затем вы можете создать метод updateQuantity, который будет вызываться при обновлении количества книг. В этот метод передается ID, название и автор книги, а также старое и новое количество. Он возвращает целое значение, указывающее на то, что было достигнуто предельное значение количества.

Следовательно, объявление Java-метода будет таким:


Листинг 6. Объявление Java-метода
                
public static int updateQuantity(int id, String title, String author,
    int oldQuantity, int newQuantity)

Целью этой функции является передача сообщения по электронной почте при достижении значением количества книг верхнего или нижнего предела. Вы объявляете константы LOW_LIMIT и HIGH_LIMIT и проверяете, является ли старое значение меньше нижнего предела и является ли новое значение больше верхнего или меньше нижнего пределов. Если это условие выполняется, вызывается еще один Java-метод, который занимается передачей сообщения по электронной почте. В этом примере вместо передачи сообщения используется вывод отладочного сообщения на экран.

Ниже приведен полный исходный код:


Листинг 7. Класс DerbyFunctions
                
package bookstoreapp.serverside;

public class DerbyFunctions
{
	
    public static final int LOW_LIMIT = 2;
    public static final int HIGH_LIMIT = 10;

    public static int updateQuantity(int id, String title, String author,
	                                 int oldQuantity, int newQuantity)
    {
        if ( oldQuantity<HIGH_LIMIT && newQuantity>=HIGH_LIMIT )
            sendEMailAlert("High limit reached", "title: "+title+", author: "+author);
        else if ( oldQuantity>LOW_LIMIT && newQuantity<=LOW_LIMIT )
            sendEMailAlert("Low limit reached", "title: "+title+", author: "+author);

        if (newQuantity>=HIGH_LIMIT)
            return +1;
        else if (newQuantity<=LOW_LIMIT)
            return -1;
        else 
            return 0;
    }
    
    public static void sendEMailAlert(String subject, String msg)
    {
        System.out.println("Sending email: " + subject);
        System.out.println(msg);
    }
    
}

Обычно хорошей практикой является проверка Java-метода путем вызова его из метода main.

Создание Derby-функции

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

Команду CREATE можно легко выполнить в SQL Scrapbook, но в данном случае для этого лучше использовать программу ij. Использование программы ij позволяет вам указывать URL соединения явно, что дает возможность включить атрибут retrieveMessagesFromServerOnGetMessage=true. Эта настройка заставляет JDBC-драйвер извлекать полное сообщение об ошибке из сервера, что очень полезно при неудачном выполнении команды.

Ниже приведены команды для выполнения в ij:


Листинг 8. создание Java-функции в Derby
                
connect 'jdbc:derby:net://localhost:1527/bookstoredb
    :user=bookstore;password=aaa;retrieveMessagesFromServerOnGetMessage=true;';
create function updateQuantity(id int, title varchar(128), author varchar(128),
    oldQuantity int, newQuantity int) returns int
PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA
EXTERNAL NAME 'bookstoreapp.serverside.DerbyFunctions.updateQuantity';

Создание Derby-функции должно быть успешным, но иногда трудно получить правильную команду сразу. Вот типичные ошибки, которые могут произойти:

  • ERROR 42962: Long column type column or parameter 'I' not permitted in declared global temporary tables or procedure definitions. (Длинный тип столбца или параметр I не разрешен в объявлении глобальных временных таблиц или в определениях процедур). Эта ошибка возникает при объявлении Derby-процедуры или функции с использованием не поддерживаемого типа аргумента.
  • ERROR 42X50: No method was found to be able to match method call pack.A.p(int), even tried all combinations of object and primitive types and any possible type conversion for any parameters the method call may have. It may be that the method exists, but it is not public and/or static, or that the parameter types are not method invocation convertible. (Не найден метод, который может соответствовать вызову метода pack.A.p(int), даже после перебора всех комбинаций объектов и примитивных типов и любых возможных преобразований типов для любых параметров, которые может иметь вызов метода. Возможно, что метод уже существует, но не указан как public и/или static, либо типы параметров не могут быть преобразованы при инициализации метода.) Эта ошибка возникает тогда, когда вы вызываете процедуру/функцию, а Derby не может найти Java-метод, соответствующий объявлению процедуры/функции. В сообщении об ошибке указывается сигнатура Java-метода, который не может быть найден.

Обратите внимание, что при изменении Java-кода метода необходимо остановить и запустить повторно сетевой сервер Derby, так чтобы загрузчик класса базы данных загрузил новый код.

После успешного создания Derby-подпрограммы вы можете протестировать ее, вызвав в командной строке ij. Derby-процедура может быть вызвана при помощи команды CALL, но в данном случае вы хотите протестировать функцию, поэтому выполните следующую команду:


Листинг 9. Вызов Java-метода в Derby
                
values(updateQuantity(1, 'title', 'author', 5, 15));

IJ отобразит возвращаемое значение, которое равно 1, потому что был достигнут верхний предел. Поскольку Java-метод выполняется в JVM сервера Derby, отладочное сообщение отобразится на стандартном устройстве вывода сервера. Используйте окно консоли eclipse для переключения в консоль сетевого сервера Derby, и вы увидите сообщение "Sending email...".

Вы можете также попробовать вызвать Derby-функцию непосредственно из вашего JDBC-приложения, используя следующий код:


Листинг 10. Вызов Java-метода из клиентского приложения
                
stmt.executeQuery("values(updateQuantity(1, 'title', 'author', 5, 15)); );

Результат будет аналогичен предыдущему тесту.

Вызов функции из триггера Derby

Последним шагом в этом разделе является настройка Derby на вызов предварительно объявленной функции каждый раз при обновлении значения количества книг. Это может быть сделано при помощи триггера.

Триггер Derby содержит информацию о выполняемом действии, а также о том, когда выполнить это действие.


Таблица 6. Предложения команды CREATE TRIGGER
INSERT, DELETE или UPDATE UPDATE
Предложение REFERENCING OLD AS OLD, NEW AS NEW. Вы должны иметь возможность обратиться к старому и новому значению для вызова функции
Предложение FOR EACH FOR EACH ROW. Функция будет вызываться для каждой строки, даже если обновляется несколько строк
Действие update books set status = updateQuantity(?) where id = NEW.id;

Ниже приведена команда для выполнения в ij, создающая триггер:


Листинг 11. Команда CREATE TRIGGER
                
create trigger updateQuantityTrig after update of quantity on books
referencing OLD as OLD NEW as NEW for each row mode db2sql
update books set status = updateQuantity(NEW.id, NEW.title, NEW.author,
    OLD.quantity, NEW.quantity) where id = NEW.id;

Простым способом проверки работы триггера является обновление таблицы книг из программы ij при помощи следующей команды: update books set quantity=10 where id=1;. Изменение таблицы вызовет выполнение функции, которая вызовет выполнение Java-метода. При этом обновится статус книги и передастся сообщение, которое можно увидеть в окне консоли сетевого сервера.

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

На следующих рисунках изображена выдаваемая клиентским приложением информация при использовании исходных данных. Обратите внимание, что на этот раз обновляется состояние книги и генерируется сообщение:


Рисунок 9. Пример выводимой информации приложением Inventory


Рисунок 10. Пример выводимой информации сетевым сервером


Развертывание приложения

На данном этапе вы имеете полностью функциональные базу данных и клиентское приложение, но они оба работают в вашей среде Eclipse, что не приемлемо для рабочих условий. Следовательно, необходимо выполнить развертывание вашего приложения.

Сохранение Java-функции в базе данных

Как указывалось ранее, Java-функция или процедура в Derby выполняется самой базой данных. Поэтому Java-класс должен быть доступен механизму базы данных. В данном случае все работает, поскольку сетевой сервер базы данных Derby работает внутри проекта Eclipse и использует classpath проекта, который содержит все созданные вами Java-классы.

В обычных производственных условиях нежелательно менять classpath для сетевого сервера Derby. Derby предоставляет несколько процедур для решения этой проблемы:

  • Процедура sqlj.install_jar устанавливает JAR-файл в саму базу данных. Будучи установленным, JAR-файл не может быть модифицирован, но вы можете использовать sqlj.remove_jar и sqlj.replace_jar для удаления или обновления JAR.
  • Свойство derby.database.classpath содержит дополнительные записи classpath, используемые базой данных. Это свойство может быть изменено при помощи процедуры syscs_util.syscs_set_database_property для обновления свойства и включения в него установленного JAR-файла.

Для целей нашего примера мы сначала создадим JAR-файл, содержащий класс DerbyFunctions. Это может быть сделано в Eclipse при помощи нажатия правой кнопкой мыши на классе и выборе пункта Export->JAR file.

Затем вы можете установить JAR-файл в вашу базу данных и добавить его в classpath, используя следующие команды (в ij):


Листинг 12. Сохранение JAR-файла в базе данных Derby
                
CALL sqlj.install_jar('functions.jar', 'bookstore.functionsjar', 0);
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(
    'derby.database.classpath', 'bookstore.functionsjar');

После этого Java-код будет принадлежать базе данных, что значительно облегчает перемещение и запуск базы данных. Каталог базы данных может быть полностью перемещен в совершенно другую среду, и приложение будет работать нормально.

Конфигурация сетевого сервера

При развертывании вашего приложения вы используете конфигурацию сетевого сервера, поэтому процесс развертывания заключается в пакетировании различных компонентов правильным способом.

На стороне сервера вы должны установить:

  • derby.jar, содержащий сервер базы данных Derby
  • derbynet.jar, содержащий сетевой сервер
  • каталог bookstoredb/, который содержит базу данных, включая JAR-файл с функциями.

Компоненты могут быть скопированы на любую машину, имеющую JVM, а сетевой сервер может быть запущен при помощи следующей команды:


Листинг 13. Запуск сетевого сервера Derby
                
java -cp derby.jar;derbynet.jar org.apache.derby.drda.NetworkServerControl start

и остановлен при помощи следующей команды:


Листинг 14. Остановка сетевого сервера Derby
                
java -cp derby.jar;derbynet.jar org.apache.derby.drda.NetworkServerControl shutdown

На стороне клиента вы должны установить:

  • db2jcc.jar и db2jcc_license_c.jar для JDBC-драйвера
  • inventory.jar, содержащий классы вашего приложения. Этот JAR-файл может быть легко создан при помощи функции eclipse export с пакетом приложения.

Эти компоненты можно скопировать на любую машину, имеющую JVM. Если сетевой сервер работает, приложение можно запустить следующей командой:


Листинг 15. Запуск клиентского приложения
                
java -cp db2jcc.jar;db2jcc_license_c.jar;inventory.jar bookstoreapp.clientside.Inventory

На следующем рисунке показано развертывание вашего приложения в конфигурации с сетевым сервером:


Рисунок 11. Конфигурация развертывания с сетевым сервером

На следующем рисунке показан процесс выполнения приложения в производственной среде:


Рисунок 12. Выполнение развернутого сетевого сервера server


Рисунок 13. Выполнение развернутого клиентского приложения

Конфигурация со встраиваемым сервером

Конфигурация с сетевым сервером, возможно, наиболее подходит для приложений такого типа, но вы можете также решить использовать конфигурацию со встраиваемым сервером, например по соображениям производительности.

Перед развертыванием приложения необходимо изменить код, так чтобы соединение выполнялось со встраиваемым сервером, а не с удаленным. Это можно сделать путем изменения имени класса JDBC-драйвера и URL соединения:


Листинг 16. Новый код подключения
                
Class.forName("org.apachy.derby.jdbc.EmbeddedDriver");
String url = "jdbc:derby:bookstoredb";	

После этого вы просто можете создать JAR-файл классов приложения, используя функцию Eclipse export, и развернуть следующие файлы на рабочей машине:

  • derby.jar, содержащий сервер базы данных Derby и JDBC-драйвер
  • inventory.jar, содержащий классы приложения
  • каталог bookstoredb/, который содержит базу данных, включая JAR-файл со встроенными процедурами и функциями

Приложение можно запустить при помощи следующей команды:


Листинг 17. Запуск приложения
                
java -cp derby.jar;inventory.jar  bookstoreapp.clientside.Inventory

На следующем рисунке показано развертывание вашего приложения в конфигурации со встраиваемым сервером:


Рисунок 14. Конфигурация со встраиваемым сервером


Миграция на DB2

Хотя Apache Derby является очень устойчивой и масштабируемой системой управления базами данных, могут существовать следующие причины для перехода на корпоративную базу данных, например DB2 UDB:

  • Отсутствие необходимых функций
  • Ограничения производительности
  • Необходимость интеграции с другими базами данных

Миграция может быть произведена довольно легко, благодаря подключаемым модулям DB2 для Eclipse и тому, что клиентское приложение основано на стандартном JDBC-интерфейсе.

Миграция базы данных

Первым шагом является миграция самой базы данных. В подключаемых модулях DB2 для Eclipse есть функция автоматической миграции базы данных Apache Derby в DB2 для Linux, Unix и Windows.

Сначала создайте базу данных DB2, выполнив команду создания базы данных bookstoredb в DB2 CLP

Затем может быть вызвана программа миграции: нажмите правую кнопку мыши на элементе базы данных derby (созданной вами ранее) в окне Database Explorer и выберите действие Migrate to DB2 UDB. Проверьте, что ваш сервер DB2 работает, и выполните следующие инструкции для создания базы данных DB2, миграции объектов базы данных и миграции фактических данных.


Рисунок 15. Миграция базы данных Derby с использованием подключаемых модулей DB2 для Eclipse

Миграция неподдерживаемых объектов вручную

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

Язык SQL Apache Derby совместим с DB2, поэтому вы можете просто повторно использовать предыдущие SQL-команды для создания отсутствующих объектов. Нажмите правой кнопкой мыши на соединении к DB2 в окне Database Explorer и откройте новый SQL Scrapbook.

Установка JAR-файла для Java-функций производится аналогично Derby, за исключением того, что нет необходимости добавлять JAR-файл в classpath. Откройте SQL scrapbook из DB2-соединения и введите следующую команду:


Листинг 18. Установка JAR-файла в DB2
                
CALL sqlj.install_jar('functions.jar', 'bookstore.jar1', 0)

Для создания функции и триггера вы просто можете скопировать и вставить используемые ранее SQL-команды в SQL scrapbook. Помните, что вы можете выполнять только одну команду за один раз и не должны использовать точку с запятой в качестве завершающего символа.


Листинг 19. Создание функции и триггера в DB2
                
create function bookstore.updateQuantity(id int, title varchar(128), author varchar(128),
    oldQuantity int, newQuantity int) returns int
PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA
EXTERNAL NAME 'bookstoreapp.StoredProcs.updateQuantity'

create trigger bookstore.updateQuantityTrig after update of quantity on books
referencing OLD as OLD NEW as NEW for each row mode db2sql
VALUES(updateQuantity(NEW.id, NEW.title, NEW.author, OLD.quantity, NEW.quantity))

Миграция клиентского приложения

Миграция клиентского приложения - это вопрос, в основном, изменения кода установки соединения с базой данных:

  • Нажмите правой кнопкой мыши на проект bookstore и выберите Apache Derby->Remove Apache Derby nature, поскольку вы больше не используете Derby. При этом из пути компоновки удаляться JAR-файлы Derby
  • Отредактируйте путь компоновки Java-проекта и добавьте jar-файлы JDBC-драйвера DB2: db2jcc.jar и db2jcc_license_cisuz.jar, которые обычно располагаются в каталоге C:\Program Files\IBM\SQLLIB\java\ (для Windows)
  • В Java-коде измените название класса JDBC-драйвера на com.ibm.db2.jcc.DB2Driver
  • Также измените URL подключения на jdbc:db2://localhost:50000/BOOKSTORE и измените имя пользователя и пароль
  • Поскольку вы, вероятно, не используете имя пользователя для bookstore, необходимо изменить схему DB2 по умолчанию. Это может быть сделано путем выполнения следующей команды при инициализации клиентского приложения: stmt.execute("SET CURRENT SCHEMA = bookstore");

Хотя JDBC API предоставляет возможность подключения к любой базе данных одним и тем же способом, реальные SQL-команды, посылаемые на сервер базы данных, должны соответствовать SQL-языку конкретной базы данных. Поэтому миграция JDBC-приложения требует перезаписи некоторых SQL-запросов. В данном случае язык Derby является подмножеством языка DB2, поэтому этот вопрос не возникает и никаких изменений в SQL-запросах не требуется.

Приложение должно теперь успешно компилироваться и выполняться с базой данных DB2. Его можно развернуть аналогичным способом, как и при конфигурации с сетевым сервером Derby.


Резюме

После прочтения этой статьи вы должны быть способны эффективно разрабатывать приложения Apache Derby с использованием различных доступных для Derby инструментальных средств. Вы должны также уметь выполнять такие сопутствующие задачи как развертывание приложения с различными возможными конфигурациями, или миграция базы данных и приложения на DB2 UDB.



Загрузка

ОписаниеИмяРазмерМетод загрузки
Java source code for the Inventory applicationInventory.java2 KBHTTP

Информация о методах загрузки


Ресурсы

  • Участвуйте в форуме для обсуждения данной статьи.

  • В статье "Cloudscape Version 10: Технический обзор" (developerWorks, август 2004) предоставлен хороший обзор базы данных Derby, включая ее архитектуру, функциональные возможности, а также рассматриваются вопросы разработки Java-функций.

  • Web-страница Apache Derby Project содержит различную информацию по базе данных Derby, включая руководства для пользователей и справочные руководства.

  • Учебник "Основы JDBC" (Sun) является хорошим введением в JDBC API.

Об авторе

author

Джилл Руа (Gilles Roux) является инженером-программистом по управлению информацией в организации IBM DB2. Его главной задачей является разработка инструментальных средств миграции баз данных.

Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Спасибо. Эта запись была помечена для модератора.


Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Сообщение о нарушении не было отправлено. Попробуйте, пожалуйста, позже.


developerWorks: вход


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


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

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

 


При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Выберите ваше отображаемое имя

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

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

(Должно содержать от 3 до 31 символа.)


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

 


Оценить эту статью

Комментарии

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management, Технология Java, Open source
ArticleID=97337
ArticleTitle=Разработка приложений Apache Derby в Eclipse
publish-date=01202005
author1-email=groux@us.ibm.com
author1-email-cc=groux@us.ibm.com

Теги

Help
Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Используйте ползунок, чтобы отразить больше или меньше тегов.

КнопкаПопулярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere).

Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).

Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Кнопка Популярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere). Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).