Разработка c помощью Apache Derby -- тройной выигрыш: Разработка баз данных при помощи Apache Derby, Часть 1

Начните работать с Derby сегодня

Хотите начать работать с Apache Derby прямо сейчас? Прочитав цикл из нескольких статей, который публикуется под рубрикой "Разработка при помощи Apache Derby - тройной выигрыш", вы сможете работать с базой данных Derby практически сразу. В первой статье цикла рассказывается об основных понятиях реляционных баз данных, причем упор делается на приложении этих тем к базе данных Derby. Вы получите представление о тесте ACID, который объясняется на простом примере, и инструменте ij, который можно использовать для интерактивной установки соединения с базой данных Derby и выполнения запросов к ней. Остальные статьи цикла помогут вам стать специалистом по работе с Apache Derby.

Роберт Бруннер , ученый-исследователь NCSA, старший преподаватель астрономии, Университет штата Иллинойс, г. Урбана-Шампейн

Роберт Дж.  Бруннер (Robert J. Brunner)Роберт Дж. Бруннер (Robert J. Brunner) занимается научными исследованиями в Национальном центре по приложениям для суперкомпьютеров и является старшим преподавателем астрономии в университете штата Иллинойс, город Урбана-Шампейн. Автор нескольких книг и множества статей и практических руководств на различные темы.



28.03.2006

Введение в системы реляционных баз данных

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

Но цель этого цикла статей – помочь вам не только приступить к работе, но и достичь вершин мастерства в использовании Apache Derby. Сначала необходимо познакомиться с тестом ACID, который является краткой инкапсуляцией основных принципов реляционных баз данных.


Тест ACID

Очевидно, что бриллианты являются ценными предметами потребления - настолько ценными, что их подделка вызывает серьезное беспокойство. Существует один простой и (по крайней мере, в фильмах) популярный тест: чтобы определить подлинность бриллианта, следует провести им по стеклу. Являясь одним из самых твердых среди известных материалов, настоящий алмаз легко процарапает поверхность стекла, в то время как поддельный, особенно если он сделан из стекла, не оставит царапины.

Для разработчиков программного обеспечения базы данных имеют практически такую же ценность. Используя базу данных, вы хотите быть уверенными в том, что она надежно сохранит ваши данные и позволит без лишних сложностей найти их впоследствии. Необходимо также, чтобы база данных позволяла нескольким программам (или пользователям) работать с данными, не пересекаясь друг с другом. Для примера представьте себе, что вы - владелец банка. Кроме всего прочего, ваша база данных должна удовлетворять следующим условиям:

  • Безопасно хранить соответствующие данные;
  • Быстро находить соответствующие данные;
  • Поддерживать множественные, параллельные пользовательские сеансы.

Все эти задачи можно обобщенно назвать тестом ACID; ACID - это акроним от словосочетания "атомарность, целостность, изоляция и надежность".

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

Целостность гарантирует, что либо все операции внутри этого единого неделимого действия (или транзакции) успешно выполняются, либо не выполняется ни одно из них. Другими словами, база данных не может оказаться в незавершенном состоянии. Чтобы понять, почему эти характеристики так важны, рассмотрим банковскую транзакцию, в процессе которой деньги передаются со сберегательного счета на чековый счет. Если в процессе передачи произойдет ошибка после списания денег со сберегательного счета и до зачисления их на чековый счет, то вы станете беднее, а у банка появится рассерженный (бывший) клиент! Атомарность позволяет рассматривать эти две операции -- списание со сберегательного счета и зачисление на чековый счет -- как единую транзакцию. Целостность гарантирует, что обе операции внутри этой транзакции либо успешно завершатся, либо не завершится ни одна из них. Таким образом, ваши деньги не будут потеряны.

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

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

Проведение теста ACID не является обычной операцией, и многие простые базы данных обнаруживают свою несостоятельность. Для критических приложений электронной коммерции или приложений, работающих через интернет, прохождение проверки ACID является необходимостью. Это одна из причин, почему так много компаний и физических лиц используют системы баз данных корпоративного уровня, таких как IBM DB2® Universal Database, Oracle 10g или Microsoft® SQL Server. Эти базы данных полностью соответствуют требованиям теста ACID. По сравнению с этими системами баз данных Apache Derby может показаться бедной падчерицей. Однако Apache Derby полностью соответствует требованиям теста ACID, и вы без опасений можете использовать ее при разработке приложений баз данных, работающих через интернет. Кроме того, если вы начали использовать Apache Derby, а ваше приложение (или предприятие) выросло, то можно перенести приложение базы данных на корпоративную систему управления базами данных, например, DB2 с минимальными сложностями.


Создание базы данных при помощи Apache Derby

Прежде, чем вы сможете работать с базой данных, вам нужно ее создать. В процессе загрузки и установки Derby вы получаете несколько инструментов. Один из них - это ij, интерактивный инструмент Java™ для осуществления коммуникаций с сервером баз данных Apache Derby. Далее в статье мы покажем, как использовать этот инструмент для выполнения простых действий с базой данных, например, для создания базы данных.

В первой статье данного цикла, вы узнаете, как загрузить и установить программное обеспечение Derby. Если вы не читали эту статью, то прочитайте ее сейчас. В частности, выполните все инструкции, чтобы иметь работоспособную версию Apache Derby на компьютере.

В конце первой статьи рассказывается, как правильно настроить систему для работы с базой данных. Обобщим: поскольку Derby является приложением Java, следует правильно инициализировать переменную окружения CLASSPATH. Можно задать переменную окружения DERBY_INSTALL, а затем добавить соответствующие файлы архива Java (JAR) в переменную CLASSPATH в файле инициализации вашей командной оболочки (например, файл .bashrc file) посредством следующей команды:

export DERBY_INSTALL='/opt/Apache/db-derby-10.1.2.1-bin'
export CLASSPATH=$DERBY_INSTALL/lib/derby.jar
export CLASSPATH=$CLASSPATH:$DERBY_INSTALL/lib/derbytools.jar:.

В системе Microsoft Windows можно получить тот же эффект,® создав пакетный файл, включающий следующие команды:

set DERBY_INSTALL=C:\Apache\db-derby-10.1.2.1-bin
set CLASSPATH=%DERBY_INSTALL%\lib\derby.jar
set CLASSPATH=%CLASSPATH%;%DERBY_INSTALL%\lib\derbytools.jar;.

Обратите внимание на то, что в этих двух примерах инициализация переменной окружения CLASSPATH (либо через команду export, либо через команду set оболочки) выполняется за два шага. Это сделано исключительно из-за ограничений на объем статьи. Вы можете использовать одну или две строки в собственной инициализации переменной.

Теперь можно выполнить этот командный файл на любом этапе, открыв командну строку. Для файла сценария в Windows или UNIX® убедитесь, что вы правильно задали каталог установки программного обеспечения Derby.

После того, как правильная установка окружения завершена, можно запустить инструмент ij для создания нового каталога, как показано в листинге 1.

Листинг 1. Работа с инструментом ij
rb$ echo $CLASSPATH
/opt/Apache/db-derby-10.1.2.1-bin/lib/derby.jar:
/opt/Apache/db-derby-10.1.2.1-bin/lib/derbytools.jar:.
rb$ mkdir derbyWork
rb$ cd derbyWork
rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> connect 'jdbc:derby:test;create=true' ;
ij> exit ;
rb$ ls -CF
derby.log       test/

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

Поскольку инструмент ij представляет собой Java-приложение, необходимо запустить виртуальную машину Java (JVM) и указать имя соответствующего основного класса, который вы хотите выполнить -- в нашем случае, инструмент ij. Если будет обработано исключение Java, еще раз проверьте переменную окружения CLASSPATH, чтобы убедиться, что в ней указан файл JAR derbytools.

При запуске инструмента ij на экран выводится информация о версии программного обеспечения и приглашение, по умолчанию это знак "больше" (>). В строке приглашения выполните команду connect, которая установит соединение с базой данных. Команде connect требуется строка указаний, чтобы найти базу данных, с которой следует установить соединение. В нашем примере строка будет выглядеть так: jdbc:derby:test;create=true. Формально эта строка называется URL Java Database Connectivity (JDBC). (JDBC - это технология Java, которая позволяет приложениям Java вести обмен данными с базой данных.)

Полный анализ JDBC URL в этой статье не приводится (дополнительную информацию см. в разделе Ресурсы). Однако наш пример несложен и может быть разбит на следующие компоненты:

  • jdbc - это механизм, при помощи которого инструмент ij осуществляет коммуникации с сервером базы данных.
  • derby - имя класса драйвера JDBC, который инструмент ij может использовать для коммуникации с сервером базы данных.
  • test - имя базы данных, которую нужно создать.
  • create=true это специфическое свойство, которое должно быть передано драйверу Derby JDBC. Свойства JDBC перечисляются в конце URL и разделяются при помощи точки с запятой.

Для правильного соединения URL JDBC должен быть передан в виде строки в команде connect; следовательно, он заключается в простые кавычки ('). И наконец, чтобы проинструктировать инструмент ij tool обработать вашу команду, следует ввести точку с запятой (поскольку ij - это инструмент Java) и нажать кнопку Return. После короткой задержки инструмент ij отобразит новое приглашение. Это говорит о том, что была создана новая база данных.

Чтобы увидеть, что произошло при выполнении команды, выйдите из инструмента ij при помощи команды exit (не забудьте точку с запятой), и просмотрите каталог, из которого был запущен инструмент ij (при помощи команды ls в UNIX-системе или команды dir в Windows-системе. Вы увидите новый файл с именем derby.log, а также новый каталог с именем test, то есть с тем именем, которое вы задали для базы данных в JDBC URL.

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

Листинг 2. Содержание каталога test
rb$ ls -CF test/
log/                    seg0/                   service.properties  
rb$ ls -CF test/log/
log.ctrl        log1.dat        logmirror.ctrl
rb$ ls -CF test/seg0/ 
c10.dat         c191.dat        c221.dat        c2c1.dat       c90.dat
c101.dat        c1a1.dat        c230.dat        c2d0.dat       ca1.dat
c111.dat        c1b1.dat        c241.dat        c2e1.dat       cb1.dat
c121.dat        c1c0.dat        c251.dat        c2f0.dat       cc0.dat
c130.dat        c1d1.dat        c260.dat        c31.dat        cd1.dat
c141.dat        c1e0.dat        c271.dat        c41.dat        ce1.dat
c150.dat        c1f1.dat        c281.dat        c51.dat        cf0.dat
c161.dat        c20.dat         c290.dat        c60.dat
c171.dat        c200.dat        c2a1.dat        c71.dat
c180.dat        c211.dat        c2b1.dat        c81.dat

При изучении каталога вас, возможно, удивит количество действий, выполненных при создании нового каталога. Но не забывайте, Apache Derby - это база данных, соответствующая требованиям ACID, поэтому очень много операций выполняется незаметно для пользователя. В основном каталоге (в данном случае, test) находятся каталог log, каталог seg0 и файл properties. Каталог log directory содержит специальные файлы журнала базы данных, которые позволяют Derby записывать действия, происходящие в процессе выполнения набора операций базы данных ( транзакции). Если сервер базы даннных Derby в процессе выполнения операции завершит работу по какой-либо причине, он может вернуться к той точке, где произошел сбой, и восстановить базу данных до нормального состояния.

В нашем примере в каталоге seg0 находятся файлы данных которые будут использоваться в базе данных test. Может показаться лишним, что все эти файлы генерируются в момент создания базы данных и, предположительно, являются пустыми. Причина заключается в том, что когда база данных сохраняет данные, она не просто создает один новый файл и сбрасывает в него данные. Из соображений производительности (и для выполнения требований ACID), база распределяет данные по нескольким файлам. Данные записываются в эти файлы в виде особых структур, которые называются страницами. Содержание страницы данных включает и сами данные, и информацию о данных на странице (эта информация иногда называется метаданными). Генерируя все эти файлы (и страницы в файлах) сразу при создании базы данных, база может начать сохранять в них данные, как только в этом возникнет необходимость.


Инструмент ij

ij - это очень мощный инструмент. Вы можете (и будете в следующих статьях) использовать его для выполнения широкого диапазона операций, среди которых создание базы данных (как вы уже видели) и создание новых объектов в базе данных. Инструмент ij имеет команду help, которая выводит на экран список и описание некоторых общих команд которые вы можете использовать, как показано в в листинге 3. Учтите, что листинг был переформатирован в связи с ограниченным объемом статьи, поэтому ваша версия может несколько отличаться.

Листинг 3. Получение справки по инструменту ij
rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> help ;
 
 Supported commands include:
 
  PROTOCOL 'JDBC protocol' [ AS ident ];
                               -- sets a default or named protocol
  DRIVER 'class for driver';   -- loads the named class
  CONNECT 'url for database' [ PROTOCOL namedProtocol ] 
                             [ AS connectionName ];
                               -- connects to database URL
                               -- and may assign identifier
  SET CONNECTION connectionName; -- switches to the specified 
                                    connection
  SHOW CONNECTIONS;            -- lists all connections
  AUTOCOMMIT [ ON | OFF ];     -- sets autocommit mode for the 
                               -- connection
  DISCONNECT [ CURRENT | connectionName | ALL ];
                               -- drop current, named, or all 
                               -- connections; the default is CURRENT
 
  COMMIT;                      -- commits the current transaction
  ROLLBACK;                    -- rolls back the current transaction
 
  PREPARE name AS 'SQL-J text'; -- prepares the SQL-J text
  EXECUTE { name | 'SQL-J text' } [ USING { name | 'SQL-J text' } ] ;
                               -- executes the statement with 
                               -- parameter values from the USING 
                               -- result set row
  REMOVE name;                 -- removes the named previously 
                               -- prepared statement
 
  RUN 'filename';              -- run commands from the named file
 
  ELAPSEDTIME [ ON | OFF ];    -- sets elapsed time mode for ij
  MAXIMUMDISPLAYWIDTH integerValue;
                               -- sets the maximum display width for
                               -- each column to integerValue
 
  ASYNC name 'SQL-J text';     -- run the command in another thread
  WAIT FOR name;               -- wait for result of ASYNC'd command
 
  GET [SCROLL INSENSITIVE] CURSOR name AS 'SQL-J query';
                               -- gets a cursor (JDBC result set) 
                               -- on the query
                               -- SCROLL cursors are only available 
                               -- in JDBC 2.0 and higher. 
                               -- (Cursor scroll type is ignored in 
                               -- JDBC 1.X.) 
  NEXT name;                   -- gets the next row from the 
                               -- named cursor
  FIRST name;                  -- gets the first row from the 
                               -- named scroll cursor
  LAST name;                   -- gets the last row from the 
                               -- named scroll cursor
  PREVIOUS name;               -- gets the previous row from the 
                               -- named scroll cursor
  ABSOLUTE integer name;       -- positions the named scroll cursor
                               -- at the absolute row number
                               -- (A negative number denotes 
                               -- position from the last row.) 
  RELATIVE integer name;       -- positions the named scroll cursor 
                               -- relative to the current row
                               -- (integer is number of rows)
  AFTER LAST name;             -- positions the named scroll cursor 
                               -- after the last row
  BEFORE FIRST name;           -- positions the named scroll cursor 
                               -- before the first row
  GETCURRENTROWNUMBER name;    -- returns the row number for the 
                               -- current position of the named 
                               -- scroll cursor (0 is returned when 
                               -- the cursor isn't positioned 
                               -- on a row.) 
  CLOSE name;                  -- closes the named cursor
  LOCALIZEDDISPLAY [ ON | OFF ];
                               -- controls locale sensitive data 
                               -- representation
 
  EXIT;                        -- exits ij
  HELP;                        -- shows this message
 
 Any unrecognized commands are treated as potential SQL-J commands 
 and executed directly.
 
ij>

Большинство команд, представленных в листинге 3, возможно, покажутся вам незнакомыми, но это нормально -- вы ведь только начинаете изучать Apache Derby.

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

Листинг 4. Установление соединений при помощи инструмента ij
ij> connect 'jdbc:derby:test;create=true' ;
WARNING 01J01: Database 'test' not created, 
connection made to existing database instead.
ij> connect 'jdbc:derby:test' ;
ij(CONNECTION1)> show connections ;
CONNECTION0 -   jdbc:derby:test
CONNECTION1* -  jdbc:derby:test
* = current connection
ij(CONNECTION1)> disconnect ;
ij> show connections ;
CONNECTION0 -   jdbc:derby:test
No current connection
ij> set connection CONNECTION0 ;
ij> show connections ;
CONNECTION0* -  jdbc:derby:test
* = current connection
ij> exit ;

В этом примере сначала производится попытка установить соединение с базой данных test при помощи оригинального JDBC URL. Здесь вы получите предупреждение, поскольку база данных test уже существует. Код обрабатывает новую команду connect, изменяя JDBC URL так, чтобы выполнялось свойство JDBC ;create=true. На этот раз предупреждение не появляется, но приглашение изменяется, теперь в нем присутствует строка (CONNECTION1). Это может показаться необычным, ведь ничего подобного не происходило при создании базы данных test.

Результат показывает, что, несмотря на предупреждение, ваша первая попытка установить соединение с базой данных test увенчалась успехом. Чтобы убедиться в том, что на данный момент установлено два соединения с одной базой данных, выполните команду show connections ; которая отобразит два соединения, соответствующие им URL и укажет, какое из соединений в данный момент является текущим (это соединение CONNECTION1).

Вам не нужны два соединения с одной базой данных прямо сейчас, поэтому вы можете воспользоваться командой disconnect ; и закрыть текущее соединение. Выполнив команду show connections ; еще раз, мы увидим, что осталось одно открытое соединение, но оно не является активным. Покольку нам нужно активное, или текущее, соединение, чтобы посылать команды конкретной базе данных, следует соответствующим образом сменить текущее соединение. Это легко осуществить при помощи команды set connections, указав в конце команды в виде параметра имя нужного соединения. Теперь, выполнив еще одну команду show connections ;, вы видите список текущих соединений вместе с именем активного соединения. И, наконец, выполните команду exit ;, чтобы разорвать все открытые соединения и завершить работу инструмента ij.


Заключение

В этой статье описываются реляционные базы данных, особое внимание уделяется тесту ACID. Тест ACID позволяет разработчикам оценить эффективность системы баз данных. Если необходима небольшая, написанная на языке Java база данных, которая поддерживает все средства, необходимые для успешного выполнения теста ACID, вам следует предпочесть базу данных Apache Derby. В этой статье также описывается инструмент ij, поставляемый в составе базы данных Derby. Инструмент ij можно использовать для установления соединений и выполнения команд для базы данных. В этой статье при помощи инструмента ij создается новая база данных, а затем изучаются каталоги и файлы, сгенерированные в процессе создания программой Derby новой базы данных.

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

Ресурсы

Научиться

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

  • Загрузите Apache Derby с домашней страницы проекта Apache Derby;
  • Загрузите IBM Cloudscape™, которая функционально эквивалентна Apache Derby и включает техническую поддержку, документацию, программы установки и примеры. При этом Derby и Cloudscape имеют один механизм базы данных.

Обсудить

Комментарии

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, Information Management
ArticleID=172042
ArticleTitle=Разработка c помощью Apache Derby -- тройной выигрыш: Разработка баз данных при помощи Apache Derby, Часть 1
publish-date=03282006