Apache Derby

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:42, 27 декабря 2017.
Apache Derby
fraimed
Разработчики: Cloudscape Inc, IBM, Apache Software Foundation
Написана на: Java
Операционная система: Java Virtual Machine
Тип ПО: реляционная СУБД
Веб-сайт apache.org

Apache Derby — реляционная СУБД, ранее известная как IBM Cloudscape, написанная на Java, предназначенная для встраивания в Java-приложения или обработки транзакций в реальном времени.

Технологии

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

Основа технологии базы данных Derby — полнофункциональное встраиваемое ядро реляционной базы данных. JDBC и SQL[Источник 1] — это доступные API для него. Поддерживается синтаксис SQL, аналогичный IBM DB2.

Сетевой сервер Derby

Сетевой сервер Derby добавляет к возможностям ядра СУБД клиент-серверные возможности. Сетевой сервер позволяет клиентам подключаться через TCP/IP, используя стандартный протокол DRDA. Сервер сети предоставляет Derby сетевую поддержку JDBC, ODBC /Call Level Interface|CLI, Perl и PHP.

Встроенный сетевой сервер

Встроенная база данных может быть также сконфигурирована для работы в качестве гибридной серверно-встраиваемой РСУБД; принимающей TCP/IP соединения от других клиентов в добавление к клиентам на той же JVM.[Источник 2]

Утилиты работы с БД

  • ij — инструмент, позволяющий выполнять SQL-сценарии для любой базы данных JDBC.
  • dblook — инструмент извлечения схемы базы данных Derby.
  • SysInfo — утилита для отображения номера версии и пути к java-классу Derby.

История

  • Разработку Apache Derby начали в 1996 году Нэт Уайэт Nat и Говард Торф, работая в компании Cloudscape Inc. Первый релиз, названный JBMS, был выпущен в 1997 году. Впоследствии продукт был переименован в Cloudscape DB, его релизы выходили примерно каждые полгода.
  • В 1999 году Cloudscape, Inc была приобретена Informix Software, Inc., а в 2001 году все разработки в области баз данных, принадлежащие Informix Software, в том числе и Cloudscape, отошли IBM. В свою очередь СУБД была переименована уже в IBM Cloudscape и продолжала выпускаться, будучи ориентированной в основном на встроенное использование с Java-продуктами IBM и промежуточным программным обеспечением.
  • В августе 2004 исходный код был передан в Apache Software Foundation под именем Derby[Источник 3]
  • В июле 2005 года проект Derby вышел из инкубатора Apache и разрабатывается в качестве суб-проекта Apache DB верхнего уровня.
  • Перед выходом Derby из инкубатора к проекту также присоединилась Sun с целью использования Derby как компонента своих продуктов и, начиная с релиза Java 6, в декабре 2006 года Sun начала поставлять Derby в составе JDK под именем Java DB.
  • В марте 2007 года IBM объявила, что отказывается от маркетинга и поддержки продукта Cloudscape, но будет продолжать вносить свой вклад в проект Apache Derby .

Сравнение с другими встроенными SQL базами данных на Java

С точки зрения скорости выполнения, Derby не показала хороших результатов в сравнении с другими встраиваемыми SQL базами данных, например, H2. Дерби не поддерживает управление конкурентным доступом с помощью многоверсионности (MVCC) в отличие от своих основных конкурентов HyperSQL и H2.

Установка на Unix[Источник 4]

Пример установки производится на Mac OS.

Шаг 1: Установить JDK

Сначала загрузите JDK . Загрузить можно по адресу http://www.oracle.com/technetwork/java/javase/downloads/index.html . После установки JDK перейдите к следующему шагу.

Шаг 2: Настроить JDK

Установите переменную среды JAVA_HOME в корневое расположение каталога установки JDK.

export JAVA_HOME=/opt/jdk9.0.1

Затем установите переменную среды PATH для включения каталога bin JDK. Переменная PATH сообщает операционной системе, где можно найти java- интерпретатор и javac- компилятор.

export PATH = $ JAVA_HOME / bin: $ PATH

Для проверки установленной версии JDK воспользуйтесь следующей командой

java -version

Шаг 3: Загрузить Derby

Загрузите бинарный дистрибутив Apache Derby с веб-сайта Derby по адресу http://db.apache.org/derby/derby_downloads.html . Для UNIX,Linux и Mac - это db-derby-10.14.1.0-bin.tar.gz

Шаг 4: Установить Derby

Создаем директорий в корневой папке /opt

mkdir /opt/Apache

Если вы находитесь не в папке со скачанным архивом, то переходим в нее (у меня в папке Downloads)

cd /Users/klarnet/Downloads

Копируем архив в нашу папку /opt/Apache

cp db-derby-10.14.1.0-bin.tar.gz /opt/Apache

Переходим в нашу папку установки /opt/Apache

cd /opt/Apache/

Распакуем наш архив

tar xzvf db-derby-10.14.1.0-bin.tar

Программное обеспечение теперь будет извлечено в подкаталог с именем db-derby-10.14.1.0-bin .

Шаг 5: Установить DERBY_INSTALL

Установите переменную DERBY_INSTALL в место, где вы установили Derby. Примеры приведены ниже, но обязательно используйте фактическое местоположение в вашей системе:

export DERBY_INSTALL = / opt / Apache / db-derby-10.14.1.0-bin/

Чтобы проверить, установилась ли переменная, напишите следующее

echo $DERBY_INSTALL

Результат правильной установки:

/ opt / Apache / db-derby-10.14.1.0-bin

Шаг 6: Настройка встроенного Derby

Чтобы использовать Derby во встроенном режиме, установите CLASSPATH для включения файлов jar, перечисленных ниже:

  • derby.jar : содержит механизм Derby и драйвер JDBC Derby Embedded
  • derbytools.jar : необязательный, предоставляет инструмент ij

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

export CLASSPATH=$DERBY_INSTALL/lib/derby.jar:$DERBY_INSTALL/lib/derbytools.jar:. 

Теперь перейдите в каталог DERBY_INSTALL / bin . Поскольку вы уже установили DERBY_INSTALL на 5 шаге, вам не нужно редактировать сценарий, поэтому продолжайте и выполните его, как показано ниже:

cd $ DERBY_INSTALL / bin 
.  setEmbeddedCP  

Шаг 7: Проверить Derby

Запустите команду sysinfo , как показано ниже, для вывода информации о системе Derby:

java org.apache.derby.tools.sysinfo 

Успешный вывод будет выглядеть примерно так:

------------------ Java Information ------------------
Java Version:    9.0.1
Java Vendor:     Oracle Corporation
Java home:       /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/jre
Java classpath:  /Users/klarnet/src:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derby.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derby.war:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_cs.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_de_DE.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_es.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_fr.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_hu.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_it.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_ja_JP.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_ko_KR.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_pl.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_pt_BR.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_ru.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_zh_CN.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyLocale_zh_TW.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyclient.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbynet.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyoptionaltools.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbyrun.jar:/Users/klarnet/sw/z/db-derby-10.14.1.0-bin/lib/derbytools.jar:/Users/klarnet/sw/db2jcc/lib/db2jcc.jar:/Users/klarnet/sw/db2jcc/lib/db2jcc_license_c.jar:/Users/klarnet/sw/mysql/connectorj/mysql-connector-java-5.0.7/mysql-connector-java-5.0.7-bin.jar:/Users/klarnet/sw/demo/jdbc.concurrent/jars/jdbc-concurrent.jar:/Users/klarnet/sw/demo/tableFunctionWhitePaper/jars/vtis-example.jar
OS name:         Mac OS X
OS architecture: x86_64
OS version:      10.13.1
Java user name:  klarnet
Java user home:  /Users/klarnet
Java user dir:   /Users/klarnet/derby/branches/10.14
java.specification.name: Java Platform API Specification
java.specification.version: 9.0.1
java.runtime.version: 9.0.1-b132
--------- Derby Information --------
[/Users/me/sw/z/db-derby-10.14.1.0-bin/lib/derby.jar] 10.14.1.0 - (1808820)
[/Users/me/sw/z/db-derby-10.14.1.0-bin/lib/derbytools.jar] 10.14.1.0 - (1808820)
[/Users/me/sw/z/db-derby-10.14.1.0-bin/lib/derbynet.jar] 10.14.1.0 - (1808820)
[/Users/me/sw/z/db-derby-10.14.1.0-bin/lib/derbyclient.jar] 10.14.1.0 - (1808820)
[/Users/me/sw/z/db-derby-10.14.1.0-bin/lib/derbyoptionaltools.jar] 10.14.1.0 - (1808820)
------------------------------------------------------
----------------- Locale Information -----------------
Current Locale :  [English/United States [en_US]]
Found support for locale: [cs]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [de_DE]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [es]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [fr]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [hu]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [it]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [ja_JP]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [ko_KR]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [pl]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [pt_BR]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [ru]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [zh_CN]
	 version: 10.14.1.0 - (1808820)
Found support for locale: [zh_TW]
	 version: 10.14.1.0 - (1808820)
------------------------------------------------------


Установка на Windows

Примеры работы в Derby

Создание таблицы

Синтаксис выражения CREATE TABLE для Apache Derby :

CREATE TABLE [schemaName.]tableName (
    { <columnDefinition> | <tableLevelConstraint>  } [,
        { <columnDefinition> | <tableLevelConstraint>  }
    ]*
) ;
  • В квадратные скобки ([ и ]) заключаются необязательные параметры.
  • Звездочка (*) после последней закрывающей квадратной скобки показывает, что в скобки можно заключить более одного объекта.
  • Вертикальная линия (|) показывает условие или/или.
  • Группа фигурных скобок ({ и }) связывает объекты друг с другом
  • В круглые скобки (( и )) заключены обязательные элементы.
  • Точка с запятой (;) показывает завершение предложения SQL

Также можно создать таблицы, которые были выше при помощи инструмента ij, который поставляется с Derby.

rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> connect 'jdbc:derby:test;create=true' ;
ij> CREATE TABLE bigdog.products (itemNumber INT NOT NULL,price DECIMAL(5, 2),stockDate DATE,description VARCHAR(128)) ;
0 rows inserted/updated/deleted
ij> CREATE TABLE bigdog.vendors (itemNumber INT NOT NULL,vendorNumber INT NOT NULL,vendorName CHAR(64)) ;
0 rows inserted/updated/deleted
ij> exit ;


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

rb$ java org.apache.derby.tools.dblook -d jdbc:derby:test
-- Timestamp: 2006-03-04 10:52:34.056
-- Source database is: test
-- Connection URL is: jdbc:derby:test
-- appendLogs: false
 
-- ----------------------------------------------
-- DDL Statements for schemas
-- ----------------------------------------------
 
CREATE SCHEMA "BIGDOG";
 
-- ----------------------------------------------
-- DDL Statements for tables
-- ----------------------------------------------
CREATE TABLE "BIGDOG"."PRODUCTS" (
    "ITEMNUMBER" INTEGER NOT NULL, 
    "PRICE" DECIMAL(5,2), 
    "STOCKDATE" DATE, 
    "DESCRIPTION" VARCHAR(128));
 
CREATE TABLE "BIGDOG"."VENDORS" (
    "ITEMNUMBER" INTEGER NOT NULL, 
    "VENDORNUMBER" INTEGER NOT NULL, 
    "VENDORNAME" CHAR(64));

Инструмент dblook - это еще один класс Java, который позволяет без лишних сложностей отобразить в консоли содержание базы данных. Этот инструмент запускается из командной строки, так же, как и любая Java-программа; единственное дополнение - это использование аргумента -d jdbc:derby:test , определяющего базу данных, которую должен запросить инструмент dblook. Если вы можете запустить инструмент ij, то файлы класса dblook уже указаны в переменной CLASSPATH.

Как показывает вывод инструмента dblook, база данных test включает схему bigdog, которая, в свою очередь, содержит таблицы products и vendors.

Вставка

С помощью SQL INSERT

INSERT INTO table-Name
    [ (Simple-column-Name [ , Simple-column-Name]* ) ]
      Expression

Термин Expression можно расширить до одной из четырех структур:

  • Однострочный список VALUES;
  • Многострочный список VALUES;
  • Выражение SELECT;
  • Выражение UNION.

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

Вставка отдельных записей с помощью ij:

rb$ java org.apache.derby.tools.ij           
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> INSERT INTO bigdog.products 
    VALUES(1, 19.95, '2006-03-31', 'Hooded sweatshirt') ;
1 row inserted/updated/deleted
ij> INSERT INTO bigdog.products
(itemNumber, price, stockDate, description) 
    VALUES(2, 99.99, '2006-03-29', 'Beach umbrella') ;
1 row inserted/updated/deleted
ij> INSERT INTO bigdog.products
(itemNumber, price, stockDate) 
    VALUES(3, 0.99, '2006-02-28') ;
1 row inserted/updated/deleted
ij> exit ;

Этот пример представляет три однострочных вставки в таблицу bigdog.products. Первое предложение SQL INSERT вставляет записи itemNumber, price, stockDate и description. Второе предложение SQL INSERT явно перечисляет все четыре столбца и соответственно вставляет новые значения. Последнее предложение SQL INSERT перечисляет только три столбца и вставляет только три значения. Столбец description остается пустым; это означает, что он имеет значение NULL. Хотя однострочные предложения SQL INSERT можно использовать, если вам нужно вставить несколько записей, более эффективно вставить их напрямую, как показано ниже.

Вставка нескольких записей с помощью ij:

rb$ java org.apache.derby.tools.ij           
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> INSERT INTO bigdog.products
(itemNumber, price, stockDate, description)
    VALUES (4, 29.95, '2006-02-10', 'Male bathing suit, blue'),
           (5, 49.95, '2006-02-20', 'Female bathing suit, one piece, aqua'),
           (6, 9.95, '2006-01-15', 'Child sand toy set'),
           (7, 24.95, '2005-12-20', 'White beach towel'),
           (8, 32.95, '2005-12-22', 'Blue-striped beach towel'),
           (9, 12.95, '2006-03-12', 'Flip-flop'),
           (10, 34.95, '2006-01-24', 'Open-toed sandal') ;
7 rows inserted/updated/deleted
ij> exit ;

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

Обновление данных

На некотором уровне оператор SQL UPDATE представляет собой объединение операторов SQL INSERT и DELETE, поскольку необходимо выбрать строки для изменения, а также определить способ их изменения. Формально синтаксис оператора UPDATE является довольно простым, так как необходимо определить для обновления несколько значений столбцов для набора строк, как это показано ниже.

UPDATE tableName
        SET columnName = Value
        [ , columnName = Value} ]*
        [WHERE clause]

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

ij> SELECT itemNumber, price, stockDate FROM bigdog.products WHERE itemNumber = 6 ;
ITEMNUMBER |PRICE   |STOCKDATE 
-------------------------------
6          |9.95    |2006-01-15
 
1 row selected
ij> UPDATE bigdog.products
    SET price = price * 1.25, stockDate = CURRENT_DATE
    WHERE itemNumber = 6 ;
1 row inserted/updated/deleted
ij> SELECT itemNumber, price, stockDate FROM bigdog.products WHERE itemNumber = 6 ;
ITEMNUMBER |PRICE   |STOCKDATE 
-------------------------------
6          |12.43   |2006-06-20
 
1 row selected

В этом примере оператор UPDATE с операторами SELECT используется для демонстрации изменения в указанной строке. Операторы SELECT служат для выбора трех столбцов в таблице bigdog.products для одной строки (строка со значением 6 в столбце itemNumber). Оператор UPDATE изменяет столбцы price и stockDate в данной строке. Значение в строке price увеличивается на 25% (например, вследствие популярности товара), а столбец stockDate изменяется для включения текущей даты, которую в Apache Derby легко получить с помощью встроенной функции CURRENT_DATE в SQL-запросе.

В предыдущем примере было показано, как изменить значения в нескольких столбцах для выбранной строки в отдельной таблице. Но иногда логика обновления выбранных строк является более сложной. Например, предположим, необходимо изменить цену всех объектов в таблице bigdog.products, поставляемых компанией Quiet Beach Industries и имеющих значение 3 в столбце vendorNumber таблицы bigdog.vendors . Для этого необходимо использовать встроенный запрос, как это показано ниже.

Обновление строк с помощью встроенного оператора SELECT:

ij> UPDATE bigdog.products
    SET price = price * 1.10, description = 'NEW: ' || description
    WHERE itemNumber IN 
        ( SELECT v.itemNumber 
          FROM bigdog.products as p, bigdog.vendors as v 
          WHERE p.itemNumber = v.itemNumber AND v.vendorNumber = 3 ) ;
2 rows inserted/updated/deleted
ij> SELECT * FROM bigdog.products ;
ITEMNUMBER |PRICE   |STOCKDATE |DESCRIPTION                             
------------------------------------------------------------------------
4          |29.95   |2006-02-10|Male bathing suit, blue                 
5          |49.95   |2006-02-20|Female bathing suit, one piece, aqua    
6          |12.43   |2006-06-20|Child sand toy set                      
9          |14.24   |2006-03-12|NEW: Flip-flop                          
10         |38.44   |2006-01-24|NEW: Open-toed sandal                   
 
5 rows selected

Удаление таблицы

Полный синтаксис удаления таблицы из базы данных:

DROP TABLE [schemaName.]tableName ;

Удаление таблицы при помощи ij:

rb$ java org.apache.derby.tools.ij
ij version 10.1
ij> connect 'jdbc:derby:test' ;
ij> CREATE TABLE temp ( aColumn INT ) ;
0 rows inserted/updated/deleted
ij> DROP TABLE temp ;
0 rows inserted/updated/deleted
ij> exit ;

Источники

  1. Apache Derby [Электронный ресурс] — Дата обращения: 16.12.2017. Режим доступа: https://db.apache.org/derby/index.html
  2. Embedded Server Example [Электронный ресурс] — Дата обращения: 16.12.2017. Режим доступа: http://db.apache.org/derby/docs/10.4/adminguide/
  3. Meet the Experts, Why IBM is open sourcing Cloudscape as Derby [Электронный ресурс] — Дата обращения: 16.12.2017. Режим доступа: https://www.ibm.com/developerworks/data/library/techarticle/dm-0410prial/
  4. Apache Derby. Install Software [Электронный ресурс] — Дата обращения: 18.12.2017. Режим доступа: https://db.apache.org/derby/papers/DerbyTut/install_software.html