2009 02 Relacyjna baza danych HSQLDB [Bazy Danych]

background image

Dla początkujących

Relacyjna baza danych HSQLDB

12

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

13

www.lpmagazine.org

lin

ux

@

so

ftw

ar

e.

co

m

.p

l

Relacyjna baza

danych HSQLDB

Świadomie i nieświadomie z bazami danych każdy z nas styka się każdego dnia – robiąc zakupy,
szukając książki w bibliotece, czy też czytając newsy na stronie internetowej. Warto więc wiedzieć
cokolwiek więcej na temat jednego z najbardziej powszechnych sposobów użytkowania komputera.
Warto zainteresować się bazami danych, gdyż z pewnością każdy znajdzie dziedzinę, w której warto
zastosować uporządkowane zarządzanie danymi w postaci bazy danych.

Grzegorz Madajczak

W

śród wielu użytkowników systemu Li-
nux panuje przekonanie, że zawsze trze-
ba mieć najlepsze, najnowsze, najbardziej
rozbudowane programy. Działają zgodnie

z zasadą – jeśli mam to za darmo, to czemu nie mam mieć
najlepszego. Nie jest ważne, że później używają jedynie 10%
możliwości oprogramowania oraz gubią się w gąszczu opcji
i możliwości.

Podobnie jest z dostępnymi silnikami bazodanowy-

mi. Użytkownik, czy też bardziej deweloper innej aplikacji
używa rozbudowanego serwera, np. MySQL, aby stworzyć
program do katalogowania płyt z domowej audioteki. Nie
rozumie, że nie zawsze trzeba stosować rozbudowane roz-
wiązania – serwery bazodanowe, takie jak MySQL, Post-
greSQL, czy Oracle do najprostszych, a nawet tych bardziej
skomplikowanych potrzeb. Nie rozumie, że zamiast nich
może posłużyć się dobrymi i prostymi – nie tak rozbudowa-
nymi programami. Proste nie oznacza bowiem, że są pozba-
wione jakiejś funkcjonalności. Dobrym przykładem na pro-
ste narzędzie do gromadzenia i zarządzania danymi jest re-
lacyjna baza danych HSQLDB. Czym są relacyjne bazy da-
nych przedstawia Ramka Relacyjne bazy danych.

Ogólne informacje

HSQLDB jest relacyjną bazą danych powstałą w oparciu
o języki JAVA oraz XML. Połączenie tych dwóch technik
sprawia, że otrzymujemy proste w obsłudze i w miarę wy-
dajne narzędzie do zarządzania danymi. Zwolennicy Wol-
nego Oprogramowania, nie koniecznie użytkownicy sys-
temu Linux, z dużym prawdopodobieństwem mieli oka-
zję nieświadomie zetknąć się z HSQLDB, jako silnikiem
bazodanowym w pakiecie OpenOffice.org – zwłaszcza w
programie OOo Base. Choćby to zastosowanie jest wspa-
niałą rekomendacją dla opisywanego projektu...

Baza danych HSQLDB rozpowszechniana jest na

podstawie licencji BSD (Berkeley Software Distribu-
tion). Nie wdając się w szczegóły różniące licencje GPL
i BSD, przypominam, że licencja typu BSD skupia się
na prawach autorskich. Jest bardzo liberalna, zezwala nie
tylko na modyfikacje kodu i jego rozprowadzanie w ta-
kiej postaci, ale także na rozprowadzanie produktu bez
postaci źródłowej czy wręcz włączenia do zamknięte-
go oprogramowania pod warunkiem załączenia do pro-
duktu informacji o autorach oryginalnego kodu i treści
licencji.

background image

Dla początkujących

Relacyjna baza danych HSQLDB

12

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

13

www.lpmagazine.org

Pakiet dystrybucyjny

Baza danych HSQLDB dystrybuowana jest w
jednej wersji – niezależnej od platformy syste-
mowej – w postaci zzipowanego pakietu, który
zawiera następujące foldery:

bin, który zawiera skrypty dla systemu

Linux oraz plik wykonywalny MSDOS
– służące do uruchomienia narzędzi
HSQLDB;

build, który zawiera plik build.xml dla me-

chanizmu ANT, a także plik wykonywalny
MSDOS – obydwa służące do samodziel-
nego zbudowania ze źródeł HSQLDB
(więcej informacji na ten temat znajduje
się w pliku readmebuild.txt);

classes, zawierający pliki *.class wygene-

rowane za pomocą ANT;

demo, który zawiera przykładowe skryp-

ty dla systemu Linux oraz pliki wykony-
walne systemu MSDOS, służące do uru-
chamiania narzędzi HSQLDB oraz samej
bazy danych HSQLDB. Znajduje się tam
również kilka przykładów dokumentów
HTML, w których HSQLDB osadzone
jest w postaci apletu;

doc, zawierającego zestaw dokumentów

HTML, PDF oraz dokumentów teksto-
wych ( w formacie *.txt) opisujących w
miarę szczegółowo różne aspekty korzy-
stania z HSQLDB oraz różne narzędzia tej
bazy;

lib, w którym zwarte są pakiety binar-

ne hsqldb.jar oraz severlet.jar służące od-
powiednio do uruchomienia bazy danych
oraz serwera sieciowego HSQLDB;

src, w którym zgromadzone są pliki źró-

dłowe *.java służące do samodzielne-
go zbudowania pakietów binarnych
HSQLDB.

Pobrany z internetu pakiet dystrybucyjny (do-
stępny pod adresem http://www.hsqldb.org),
wystarczy rozpakować na dysku. Tak przy-
gotowany pakiet jest gotowy do użycia – nie
wymaga jakichkolwiek innych czynności in-
stalacyjnych. Bazą danych HSQLDB mo-
żemy posługiwać się również w przestrze-
ni użytkownika – bez konieczności posiada-
nia uprawnień administratora systemu. Wy-
starczy rozpakować pakiet i już można go
użytkować.

Uruchomienie

serwera baz danych

Baza danych HSQLDB może być uruchomiona
na kilka różnych sposobów. Generalnie rzecz
ujmując, sposoby te można podzielić dwoja-
ko: tryb serwera (Server Mode) oraz praca jako

proces aplikacji (In-Process Mode). Tryb ser-
wera oferuje maksimum wydajności i możli-
wości. Silnik bazodanowy pracuje w przestrze-
ni wirtualnej maszyny JAVA (JVM – JAVA Vir-
tual Machine
), nasłuchując połączeń wywoły-
wanych przez programy uruchomione na tym
samym komputerze lub na innych kompute-
rach w sieci. Różne programy mogą jednocze-
śnie połączyć się z bazą danych w celu uzyska-
nia lub przesłania informacji (danych), łącząc
się z bazą danych za pomocą sterownika JDBC
HSQLDB. W trybie tym serwer baz danych
może obsługiwać jednocześnie do 10 baz da-
nych.Więcej na temat drugiego trybu (In-Pro-
cess
) będzie można dowiedzieć się z rozdziału

tego artykułu, który został poświęcony zastoso-
waniu HSQLDB w programach JAVA.

Dostępne są trzy różne formy serwera baz

danych, oferujące różne protokoły komunika-
cji pomiędzy klientem, a serwerem. Pierw-
sza z form to tradycyjna baza danych, któ-
ra zapewnia jednocześnie największą wydaj-
ność. Najprostszą formą jej uruchomienia bę-
dzie wykonanie w terminalu następującego
polecenia:

$ java -cp ścieżka_dostępu/hsqldb.jar
org.hsqldb.Server -database.0 file:
ścieżka_dostępu/moja_baza -dbname.0
moja_baza

Listing 1.

Kod przykładowego pliku server.properties

# Przykładowy plik serwera HSQDB
server.database.0 file:ścieżka_dostępu;ifexists=

true

server.dbname.0 nazwa_bazy_danych
server.port 9001

Listing 2.

Pojedyncza sekcja pliku konfiguracyjnego narzędzia SQLTool – sqltool.rc

urlid test_hsqldbase
url jdbc:hsqldb:hsql://localhost/ścieżka_dostępu
username nazwa_użytkownika

password

hasło_użytkownika

Listing 3.

Uwierzytelnianie metodą inlineRC podczas łączenia się z serwerem

$ java -jar $HSQLDB_HOME/lib/hsqldb.jar

--inlineRC

URL=jdbc:hsqldb:hsql://localhost/ścieżka_dostępu,

USER

=nazwa_użytkownika,

PASSWORD

=hasło_użytkownika

Listing 4.

Ogólna składnia definicji kolumny tabeli

nazwa_kolumny typ_danych [

(

wielkość kolumny

)

]

[{

DEFAULT

<wartość_domyślna> |

GENERATED BY

DEFAULT

AS

IDENTITY

(

START

WITH

<n>[, INCREMENT BY <m>]

)

}] |

[[

NOT

]

NULL

] [IDENTITY] [

PRIMARY

KEY

]

Listing 5.

Przykładowe polecenie utworzenia tabeli

sql>

create

text

table

kontrahenci

(

id int generated by

default

as

identity

(

start

with

0

)

not

null

primary

key

,

imie varchar

(

50

)

not

null

,

nazwisko varchar

(

100

)

not

null

,

firma varchar

(

200

)

not

null

)

;

Listing 6.

Ogólna składnia definicji ograniczeń

[

CONSTRAINT

<nazwa>]

UNIQUE

(

<kolumna> [,<kolumna>...]

)

|

PRIMARY

KEY

(

<kolumna> [,<kolumna>...]

)

|

FOREIGN

KEY

(

<kolumna> [,<kolumna>...]

)

REFERENCES

<tabela

referencji>

(

<kolumna> [,<kolumna>...]

)

[

ON

{DELETE |

UPDATE

}

{CASCADE |

SET

DEFAULT

|

SET

NULL

}] |

CHECK

(

<warunki wyszukiwania>

)

background image

14

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

15

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

Powyższe polecenie tworzy i uruchamia bazę
danych o nazwie

moja_baza

. Należy zwrócić

uwagą na dwa argumenty tego polecenia. War-
tość pierwszego z nich –

database.0

to ścież-

ka dostępu do pliku tworzonej bazy danych.
Drugi argument –

dbname.0

określa alias (na-

zwę) bazy danych. Nazwą tą będziemy posłu-
giwali się późnej wielokrotnie łącząc się z ba-
zą danych.

Zaglądając do folderu, w którym umieści-

liśmy nowoutworzoną bazę danych, zobaczy-
my, że pojawiły się tam dwa nowe pliki: mo-
ja_baza.properties
oraz moja_baza.log. Są to
pliki utworzonej bazy danych. Pierwszy z nich
– z rozszerzeniem *.properties zawiera infor-
macje o ogólnych ustawieniach bazy danych.
Natomiast plik z rozszerzeniem *.log zawie-
ra informacje o zmianach wprowadzanych do
bazy danych.

Zaprezentowane powyżej rozwiązanie wy-

korzystuje bazę danych zapisaną w kilku pli-
kach zapisanych na dysku – według wskazanej
ścieżki dostępu. Istnieje jednak możliwość uru-
chomienia serwera bazy danych, który będzie
działał tylko w pamięci operacyjnej kompute-
ra – tymczasowo. Oznacza to, że po zamknię-
ciu serwera dane zgromadzone w takiej bazie
zostaną bezpowrotnie utracone. W celu urucho-
mienia takiego serwera HSQLDB wykonujemy
w konsoli następujące polecenie:

$ java -cp ścieżka_dostępu/hsqldb.jar
org.hsqldb.Server -database.0 mem:
in_memdb -dbname.0 in_memdb

W stosunku do uprzednio przedstawionego
rozwiązania, różnica polega na zastosowaniu
przedrostka

mem:

zamiast

file

jako wartości ar-

gumentu

-database.0

.

Inną formą bazy danych jest serwer sie-

ciowy, który do komunikacji z klientem wy-
korzystuje protokół HTTP. Przykładem wy-
korzystania tego rozwiązania są sytuacje na-
rzucane przez ograniczenia zapory sieciowej,
która nie przepuszcza innej komunikacji, jak
przez port 80. Należy jednak pamiętać, iż ser-
wer sieciowy nie oferuje tej samej wydajno-
ści, co zwykły serwer. Uruchomienie serwera
sieciowego HSQLDB nie różni się zbytnio od
opisanych wcześniej metod.

$ java -cp ścieżka_dostępu/hsqldb.jar
org.hsqldb.WebServer -database.0
file:ścieżka_dostępu/moja_baza_web -
dbname.0 moja_baza_web

Podobnie, jak i w poprzednich przykładach
możliwe jest uruchomienie serwera sieciowego
HSQLDB działającego tylko w pamięci opera-
cyjnej komputera:

$ java -cp ścieżka_dostępu/hsqldb.jar
org.hsqldb.WebServer -database.0 mem:
moja_baza_web -dbname.0 moja_baza_web

Instalacja serwera

baz danych HSQLDB

Opisane powyżej przykłady pokazują, w ja-
ki sposób szybko uruchomić serwer HSQLDB.
Ich wadą jest to, że przy każdym starcie syste-
mu trzeba powtarzać te same czynności. Moż-
na jednak tak przygotować nasz system, aby ba-
za danych HSQLDB startowała automatycznie
jako proces działający w tle. W tym celu uprzed-
nio pobrany zzipowany pakiet, zawierający bi-
narne pliki serwera baz danych, należy rozpako-
wać do dowolnego folderu. Kolejnym krokiem
jest sprawdzenie czy mamy zdefiniowaną w sys-

temie zmienną

JAVA_HOME

. Najlepiej dokonać

tego wydając w konsoli następujące polecenie:

$ env | grep JAVA_HOME

Przy braku odpowiedzi, należy sprawdzić,
gdzie w naszym systemie znajdują się pliki ma-
szyny wirtualnej JAVA. Wydajemy w tym ce-
lu polecenie, które odnajdzie nam wykonywal-
ny plik java:

$ whereis java

Istnieje duże prawdopodobieństwo, że pomo-
że to ustalić lokalizację JVM. Posiadając taką
wiedzę należy zdefiniować zmienną

JAVA_HO-

ME

, stosując polecenie

export

:

$ export JAVA_HOME; JAVA_HOME=/usr/
java/j2sdk1.6.0

Następnie należy odpowiednio zmodyfiko-
wać zmienną

CLASSPATH

, tak aby wskazywa-

ła ścieżkę dostępu do folderu zawierającego
plik hsqldb.jar:

$ export CLASSPATH; CLASSPATH=ścieżka_
dostępu_do_hsqldb.jar

Ostatnim zadaniem będzie utworzenie pli-
ku właściwości bazy danych HSQLDB – se-
rver.properties
, który musi znaleźć się w ka-
talogu domowym użytkownika bazy danych.
Przykładowy plik *.properties znajduje się
w pakiecie dystrybucyjnym HSQLDB wśród
innych plików źródłowych (ścieżka dostępu:
src/org/hsqldb/sample/sample-server.proper-
ties
). Nic nie stoi jednak na przeszkodzie, aby
plik ten utworzyć samodzielnie. Przykładowy
plik server.properties przedstawiony został na
Listingu 1, a opis właściwości pliku konfi-
guracyjnego, wraz z wartościami domyślny-
mi przedstawia Tabela 1. Pierwsze dwa wier-
sze Listingu zawierające opcje konfiguracyjne
serwera HSQLDB nie wymagają komentarza
– mają taką samą funkcję, jak argumenty po-
dawane w linii poleceń podczas ręcznego uru-
chamiania serwera. Jedyną różnicą jest argu-
ment

ifexist=true

w pierwszej linii opcji.

Argument ten oznacza, że baza danych ma
być uruchomiona niezależnie od tego, czy plik
podany w ścieżce dostępu istnieje, czy też nie.
W przypadku braku pliku zostanie utworzona
nowy serwer, w nowych plikach, o podanej
ścieżce dostępu. Wartość

true

jest wartością

domyślą. Jej przeciwieństwo (

ifexist=fal-

se

) oznacza, że przy braku wskazanego pliku

serwer nie zostanie uruchomiony. Natomiast
ostatni wiersz określa port na którym serwer

Listing 7.

Tworzenie tabeli z wielokolumnowym kluczem głównym oraz tabeli z kluczem obcym

sql>

create table

klient

(

imie varchar

(

50

)

not

null

,

nazwisko varchar

(

100

)

not

null

,

adres varchar

(

150

)

,

pesel varchar

(

11

)

,

unique

(

pesel

)

,

primary

key

(

imie, nazwisko

))

;

sql>

create table

firmy

(

id int generated by

default

as

identity

(

start

with

0

)

,

wlasciciel_imie varchar,
wlasciciel_nazwisko varchar,
adres_firmy varchar,
nip varchar

(

10

)

,

konto varchar

(

26

)

,

foreign

key

(

wlasciciel_imie, wlasciciel_nazwisko

)

references

klient

(

imie, nazwisko

))

;

background image

14

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

15

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

będzie nasłuchiwał – domyślnie jest to 9001
lub 554 dla połączenia szyfrowanego TLS.

Ostatnią czynnością będzie uruchomie-

nie procesu serwera bazy danych HSQLDB,
za pomocą polecenia

nohup

, które sprawi, że

rozpoczęty w ten sposób wątek będzie dzia-
łał w tle.

$ nohup java org.hsqldb.Server &

Aby przekonać się, że serwer działa w tle można
wydać polecenie

ps

, listujące aktywne procesy.

$ ps -A | grep hsqldb.jar

Niemalże identycznie należy postępować
w przypadku uruchamiania serwera siecio-
wego HSQLDB. Różnica polega na tym, że
plik konfiguracyjny serwera sieciowego to
oczywiście webserver.properties z właści-
wościami o przedrostku server, z dwoma
dodatkowymi właściwościami:

server.de-

fault_page

– definiującą domyślną stronę

dla serwera oraz server.root – określającą
lokalizację plików serwera. W tym wypadku
uruchamiany jest program org.hsqldb.We-
bServer.

W pakiecie dystrybucyjnym bazy da-

nych HSQLDB znajduje się również przy-
kładowy skrypt systemu

init

– hsqldb, któ-

ry po skopiowaniu do folderu /etc/init.d lub
/etc/rc.d/init.d
(różnie w zależności od dys-
trybucji, wymagane są uprawnienia admini-
stratora systemu), pozwala na automatyczny
start serwera HSQLDB podczas uruchamia-
nia systemu. Skrypt ten znajduje się w fol-
derze bin pakietu instalacyjnego. Ponadto w
folderze src/org/hsqldb/sample/ znajduje się
opatrzony bogatymi i czytelnymi komenta-
rzami plik sample-hsqldb.cfg, w którym za-
warta jest podstawowa konfiguracja syste-
mowa serwera HSQLDB. Obejmuje ona ta-
kie informacje, jak lokalizacja JAVA, czy pa-
kietu HSQLDB. Plik ten należy samodzielnie
zmodyfikować, a następnie umieścić w tym
samym miejscu, co skrypt systemu init. W
folderze domowym root-a powinny znaleźć
się dwa pliki – plik server.properties, będą-
cy kompilacją potencjalnych plików *.pro-
perties
konkretnych baz danych (zawiera te
same dane kolejno dla każdego z serwerów)
oraz plik sqltool.rc, który zostanie omówiony
w następnym rozdziale artykułu.

Dostęp do bazy

danych – SQLTool

Silnik bazodanowy HSQLDB dostarcza
własne narzędzie służące do zarządzania
serwerem i danymi bazy za pomocą języ-

ka SQL – SQLTool. Jest to narzędzie uru-
chamiane i działające z linii poleceń, przez
co może być używany na przykład zdalnie
– poprzez połączenie SSH. Dodatkową za-
letą SQLTool jest możliwość używania nie
tylko w odniesieniu do HSQLDB, lecz do
każdej innej bazy danych, która posiada ste-
rownik JDBC.

Narzędzie SQLTool wymaga do dzia-

łania JVM firmy Sun w wersji 1.4 lub póź-
niejszej. Autorzy projektu sumiennie zazna-
czają, iż program ten nie był testowany na in-
nych wersjach JVM, niż oryginalny produkt
firmy Sun, więc możliwe jest, że w przy-
padku innych odmian JVM, jak na przykład
Blackdown Java, czy IBM Java mogą wystą-
pić trudne do przewidzenia nieprawidłowości
działania programu.

Przed rozpoczęciem pracy z SQLTool w

katalogu domowym użytkownika musi zna-
leźć się plik konfiguracyjny sqltool.rc. Przykła-
dową wersję tego pliku można znaleźć w pa-
kiecie dystrybucyjnym HSQLDB w folderze
src/org/hsqldb/sample. W pliku tym znajdują
się przykładowe konfiguracje zarówno do ob-
sługi serwera HSQLDB, jak i innych serwerów
bazodanowych.

Plik ten składa się z sekcji, które opisują

konfiguracje dla poszczególnych serwerów, z
których można korzystać za pośrednictwem
narzędzia SQLTool. Przykładowa sekcja pli-
ku sqltool.rc została przedstawiona na Listin-
gu 2. Identyfikator konfiguracji określony
jest jako wartość argumentu

urlid

. W kolej-

nym wierszu znajduje się wartość argumen-
tu

url

określająca oczywiście adres serwera

baz danych. Dla niezaznajomionych z inter-
fejsem JDBC, wyjaśniam, że adres ten skła-
da się z wywołania warstwy pośredniczącej

JDBC, następnie po dwukropku identyfikato-
ra sterownika JDBC oraz na końcu, także po
dwukropku, właściwego URL. W przypadku
sterownika hsqldb należy jeszcze określić,
czy mamy do czynienia z bazą danych w pli-
ku (

file:

), czy też zlokalizowaną w pamię-

ci (

mem:

). Następne dwa wiersze sekcji okre-

ślają kolejno nazwę użytkownika oraz hasło
dostępu do serwera. Inne opcje, które mogą
znaleźć się w sekcji konfiguracyjnej to:

charset

– określająca stronę kodową zna-

ków, stosowaną przez narzędzie SQLTool;

driver

– określająca klasę sterownika

JDBC dla konfigurowanego serwera;

truststore

– określająca ścieżkę dostępu

do pliku zawierającego klucz stosowany w
szyfrowanym połączeniu z serwerem TLS.

Jak łatwo zauważyć stosowanie pliku konfigu-
racyjnego sqltool.rc ma jedną zasadniczą wa-
dę. Na dysku komputera zostają zapisane nie
chronione w jakikolwiek sposób poufne dane
– adresy, loginy i hasła do serwerów baz da-
nych. Jeśli korzystamy z SQLTool dla potrzeb
lokalnej bazy danych na domowym kompute-
rze, to rozwiązanie takie może nawet ujść. Jest
ono jednak nie do zaakceptowania w środowi-
skach produkcyjnych – stwarza zbyt wysoki
ryzyko przejęcia kontroli nad zasobami, któ-
re powinny być chronione.

Z powyższych względów SQLTool

umożliwia łączenie się z serwerem i uwie-
rzytelnianie stosując metodę

inlineRC

. Me-

toda ta polega na podaniu w linii poleceń
wszystkich informacji,niezbędnych do uzy-
skania połączeni z serwerem, już na etapie
uruchamiania polecenia

sqltool

. Stosuje-

my w tym celu przełącznik

--inlineRC

. Po-

Tabela 1.

Właściwości serwera HSQLDB

Właściwość

Wartość domyślna

Opis cechy

Właściwości serwera i serwera sieciowego

server.database

file:ścieżka_do-
stępu

Ścieżka dostępu do plików serwera

mem:baza_danych

Plik serwera zlokalizowany w pamięci komputera

server.dbname

Nazwa (alias) bazy danych

server.port

9001

Port, na którym serwer nasłuchuje połączeń od klienta

554 (TLS)
80 (WebServer)

server.silent

true

Cichy tryb serwera (minimalna ilość komunikatów)

Właściwości tylko serwera

server.no_sys-
tem_exit

true

Nie wywołuje metody

System.exit()

przy zamknię-

ciu serwera

Właściwości tylko serwera sieciowego

server.default_page

index.html

Domyślny dokument serwera

server.root

./

Domyślna lokalizacja plików serwera

background image

16

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

17

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

łączenie tą metodą z serwerem opisanym w
treści pliku sqltool.rc z Listingu 2, przedsta-
wiono na Listingu 3. Oprócz zaprezentowa-
nych na listingu trzech podstawowych wła-
ściwości, dodatkowo, po przecinkach, moż-
na również określić stronę kodową znaków
(

CHARSET

) oraz plik zawierający klucz TLS

(

TRUST

).

Metoda uwierzytelniania inlineRC charak-

teryzuje się również interaktywnością. Ozna-
cza, to, że gdy podamy jedynie URL, program
podczas logowania zapyta się nas o niezbędne
brakujące informacje – nazwę użytkownika i
przypisane mu hasło.

Graficzne

narzędzie do zarządzania bazą

W pakiecie dystrybucyjnym HSQLDB oprócz
omawianego powyżej narzędzia SQLtool
znajduje się również program napisany w JA-
VA służący do zarządzania bazą danych. De-
weloperzy dostarczają dwie wersje tego same-
go narzędzi – jedną napisaną z użyciem biblio-
tek AWT, druga zaś wersja wykorzystuje bi-
blioteki Swing.

Obie wersje nie różnią się niczym w swej

funkcjonalności. Różnica polega jedynie na
wyglądzie interfejsu – odmiennym ze względu
na rodzaj użytej biblioteki.

Uruchomienie obu wersji programu jest

podobne:

$ java -cp hsqldb.jar cp org.hsqldb.u
til.DatabaseManager

Powyższe polecenie uruchamia narzędzie
napisane w AWT. Jeśli chcemy urucho-
mić program napisany z użyciem bibliote-
ki Swing, polecenie będzie wyglądało na-
stępująco:

$ java -cp lib/hsqldb.jar org.hsqldb.
util.DatabaseManagerSwing

Program DatabaseManager (Rysunek 1) jest ła-
twym w użyciu, intuicyjnym narzędziem, dzię-
ki któremu możemy łączyć się z różnymi ba-
zami danych, z możliwością zapisywania usta-
wień dla każdej bazy danych.

Zarządzanie

użytkownikami bazy danych

Nowoutworzona baza danych zawiera do-
myślnego użytkownika sa z prawami admi-
nistratora, który nie ma jednak przypisanego
hasła. Dlatego też zaraz po zalogowaniu się
do serwera, dobrze jest nadać użytkowniko-
wi sa hasło, stosując powyższe polecenie w
języku SQL:

sql> set password ”nowe_hasło”;

Należy pamiętać, aby po wprowadzeniu tej
zmiany zmodyfikować odpowiednio plik
sqltool.rc. Jednak posługiwanie się na co
dzień kontem administratora nie jest do-
brym rozwiązaniem. Dlatego warto jest
stworzyć dodatkowego użytkownika bazy
danych. Dokonujemy tego poleceniem

CRE-

ATE USER

, którego ogólna składnia wyglą-

da następująco:

CREATE USER <nazwa_użytkownika>
PASSWORD <hasło> [ADMIN];

W miejscach

<nazwa_użytkownika>

oraz

<hasło>

wprowadzamy odpowiednie infor-

macje. Słowo kluczowe

ADMIN

na końcu po-

lecenia oznacza, że nowotworzonemu użyt-
kownikowi nadajemy prawa administrato-
ra bazy danych. Tak więc przykładowe pole-
cenie tworzące użytkownika gmad z hasłem
123456abc, który posiada uprawnienia admi-
nistratora wygląda następująco:

sql> CREATE USER gmad PASSWORD
123456abc ADMIN;

Raz nadane hasło może być zmienione za po-
mocą polecenia

ALTER USER

o następującej bu-

dowie:

ALTER USER <nazwa_użytkownika> SET
PASSWORD <nowe_hasło>;

Uprawnienia użytkownika mogą być modyfi-
kowane przez administratora serwera za pomo-
cą polecenia

GRANT

, którego ogólna struktura

wygląda następująco:

GRANT { SELECT | DELETE | INSERT |
UPDATE | ALL } [,...]
ON { table | CLASS "package.class" }
TO <nazwa_użytkownika>;

Chcąc nadać użytkownikowi o nazwie gmad
uprawnienia do pobierania danych oraz wsta-
wiania danych do tabeli o nazwie tabela_1 po-
lecenie to przyjmie następujący kształt:

sql> grant select,insert on tabela_1
to gmad;

Oczywiście istnieje możliwość odebrania
wcześniej przyznanych uprawnień. Służy do
tego polecenie

REVOKE

, o następującej składni:

REVOKE { SELECT | DELETE | INSERT |
UPDATE | ALL } [,...]
ON { table | CLASS "package.class" }
FROM <nazwa_użytkownika>;

Odebranie użytkownikowi gmad uprzednio
nadanych uprawnień będzie wyglądało nastę-
pująco:

sql> revoke select,insert on tabela_1
from gmad;

Relacyjne bazy danych wyróżniają się wśród innych typów (np. kartotekowe, obiekto-
we, hierarchiczne, …), że tablice w niej zawarte mogą być ze sobą wzajemnie powią-
zane (np. wymieniać się informacjami dzięki kluczom obcym). Bazy takie korzystają z
języków programowania, zwykle SQL, za pomocą których dana baza jest obsługiwa-
na. W bazach takich dane gromadzone są w postaci dwuwymiarowych tabel (nazywa-
nych relacjami), które obowiązkowo muszą zawierać przynajmniej jedną kolumnę (atry-
but) oraz mogą zawierać zero lub więcej wierszy (inaczej – krotek). Istotne jest to, że
z braku możliwości identyfikacji wiersza przez jego pozycję, konieczna jest obecności
przynajmniej jednej niepowtarzalnej w obrębie całej tabeli kolumny, która pozwala od-
naleźć konkretny wiersz. Kolumnę taką określa się jako klucz podstawowy (ang. pri-
mary key
) tabeli.

Relacyjne bazy danych

SQL (Structured Query Language) – strukturalny język zapytań używany do tworzenia, mo-
dyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych. Język
ten został opracowany na początku lat 70-tych w firmie IBM, z czasem stając się standar-
dem w komunikacji z bazami danych. Obecnie wykorzystywany jest przez wszystkie liczą-
ce się silniki bazodanowe, uzyskując liczne odmiany.

Język SQL

background image

16

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

17

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

Oczywiście można również usunąć użytkowni-
ka bazy danych. Służy do tego polecenie

DROP

USER

o następującej składni:

DROP USER <nazwa_użytkownika>.

Tak więc usunięcie domyślnego użytkownika
sa (czynność, do której gorąco namawiam po
stworzeniu własnego administratora) wygląda
następująco:

sql> DROP USER sa;

Tworzenie tabeli

Jakakolwiek baza danych nie może prawidło-
wo funkcjonować bez tabel gromadzących da-
ne. Utworzenie nowej tabeli w HSQLDB nie
różni się znacząco od sposobów realizacji te-
go zadania w innych silnikach bazodanowych,
obsługujących SQL. Służy do tego polecenie

CREATE TABLE

, o następującej składni:

CREATE [MEMORY|CACHED|[GLOBAL]TEMPORA
RY|TEMP|TEXT] TABLE <nazwa_tabeli>
( <definicja kolumny> [, ...] [,
<definicja ograniczeń>...] )
[ON COMMIT {DELETE | PRESERVE} ROWS];

Najważniejszym elementem, który jednocze-
śnie sprawia początkującym użytkownikom
najwięcej kłopotu jest definicja kolumny.
Ogólny schemat tej definicji przedstawia Li-
sting 4. Istotnym elementem definicji kolum-
ny jest prawidłowy dobór typu danych. Oso-
bom zaznajomionym z językiem JAVA typy
danych nie sprawią kłopotu, gdyż są one bez-
pośrednim odniesieniem do typów danych
stosowanych w tym języku. Najważniejsze

typy danych używane w HSQLD prezentu-
je Tabela 2.

Tworząc tabelę zaraz na samym począt-

ku należy zdecydować, w jaki sposób da-
na tabela będzie przechowywana. Domyśl-
nym typem są tabele przechowywane w pa-
mięci (typ

MEMORY

). Całość ich struktury i

danych przechowywane są w pamięci kom-
putera, lecz wszelkie zmiany zachowywa-
ne są na dysku w postaci pliku <nazwa_ta-
bli>.script
. Przy kolejnym otwarciu tabeli
wszelkie zmiany wprowadzone do niej są au-
tomatyczne w prowadzane do tabeli otwartej
w pamięci. Podobne do tabel typu

MEMEORY

tabele typu

CACHED

, które również przecho-

wywane są w pamięci, lecz jedynie w po czę-
ści – część danych, indeksy. Ten typ tabeli ma
zastosowanie w odniesieniu do bardzo du-
żych tabel, które zajęłyby w pamięci znaczną
jej przestrzeń. Tabela typu

TEMP

jest również

przechowywana tylko w pamięci, z tą różnicą
w odniesieniu do tabeli typu

MEMORY

, że obo-

wiązuje ona jedynie na czas bieżącego połą-
czenia i po jego zamknięciu zostaje automa-
tycznie usunięta. Natomiast tabele typu

TEXT

charakteryzują się tym, że zapisywana są na
dysku w pliku tekstowym CSV.

Istnieją pewne ograniczenia w stosun-

ku do wyboru typu tabel. Jeśli utworzona ba-
za danych istnieje tylko w pamięci (typ

mem

),

jedyną dozwolonym typem tabeli jest

MEMO-

RY

. Tabela typu

CASHED

zostanie przekształco-

ne na tabelę typu

MEMORY

. Polecenie utworze-

nia tabeli typu

TEXT

zostanie w tym przypad-

ku odrzucone.

W sekcji dotyczącej definicji kolum-

ny wyjaśnienia wymagają słowa kluczowe

NULL

/

NOT NULL

,

IDENTITY

oraz

PRIMARY

KEY

. Pojęcia

NULL

i

NOT NULL

definiują, czy

możliwe jest przechowywanie wartości pu-
stych. Jeśli chcemy aby kolumna obowiąz-
kowo zawierała dane – należy ustawić war-
tość

NOT NULL

. Próba wprowadzenia war-

tości pustej wywoła błąd. Kolumny z usta-
wioną wartością

IDENTITY

gromadzą iden-

tyfikatory dla wprowadzonej krotki danych.
Kolumna ta obowiązkowo musi mieć typ

INT

lub

BIGINT

oraz z zasady jest przecho-

wuje jedynie wartości nie-puste (

NOT NULL

).

Ponadto kolumna z wartością

IDENTITY

charakteryzuje się automatycznym przyro-
stem za każdą wprowadzaną krotką danych.
Możliwe jest określenie wartości początko-
wej tej kolumny stosując polecenie

START

WITH <n>

, lecz definicja takiej kolumny wy-

gląda nieco inaczej – tak, jak na przykładzie
zaprezentowanym na Listingu 5. Zastoso-
wanie polecenia

IDENTITY()

zwraca ostat-

nią wartość kolumny z wartością

IDENTITY

wprowadzoną w bieżącym połączeniu. Na-
tomiast pojęcie

PRIMARY KEY

oznacza uni-

kalny klucz główny tabeli – służący indek-
sowaniu tabeli, co przyśpiesza jej przeszu-
kiwanie. Kolumna

PRIMARY KEY

obowiąz-

kowo musi być

NOT NULL

oraz tabela mo-

że mieć tylko jeden klucz główny, choć mo-
że być złożony z wielu kolumn. Listing 5
przedstawia przykładową definicję tabeli z
czterema kolumnami, z których jedna jest
identyfikatorem.

Analizując ogólną składnię polecenia

tworzenia tabeli, na samym jej końcu znaj-
duje się nieobowiązkowa sekcja

<definicja

ograniczeń>

, która pozwala na dodawanie

lub usuwanie ograniczeń w stosunku do ta-
beli. Ogólna składnia tej sekcji została przed-

Tabela 2.

Typy danych kolumn

Nazwa

Odpowiadający typ JAVA

Opis

INTEGER | INT

java.lang.Integer

Standardowa liczba całkowita z zakresu od -2147483648 do 2147483647. W
przypadku liczb bez znaku zakres ten wynosi od 0 do 4294967295.

DOUBLE [PRECISION] | FLOAT

java.lang.Double

Liczba zmiennoprzecinkowa, gdzie

PRECISION

określa dokładność liczby.

VARCHAR

java.lang.String

Tekst o zmiennej długości o maksymalnej długości 4294967295 znaków.

VARCHAR_IGNORECASE

java.lang.String

Tekst jak wyżej – tylko małe litery.

CHAR | CHARACTER

java.lang.String

Łańcuch znaków o maksymalnej długości 4294967295 znaków.

DATE

java.sql.Date

Data w formacie RRRR-MM-DD

TIME

java.sql.Time

Czas w formacie GG-MM-SS

TIMESTAMP | DATETIME

java.sql.Timestamp

Przedział czasowy

BOOLEAN | BIT

boolean | java.lang.Boolean

Wartość logiczna

SMALLINT

short | java.lang.Short

Mała liczba całkowita z zakresu od -32768 do 32767

BIGINT

long | java.lang.Long

Duża liczba całkowita z zakresu od -9223372036854775808 do
9223372036854775807. Dla liczb bez znaku zakres ten wynosi od 0 do
18446744073709551615

BINARY

byte[]

Tablica bitów

OTHER | OBJECT

java.lang.Object

Obiekt

background image

18

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

19

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

stawiona na Listingu 6. Część z obecnych
tam opcji została omówiona już wcześniej,
np. tworzenie klucza głównego tabeli przy
zastosowaniu

PRIMARY KEY

. Wewnątrz sek-

cji

CONSTRAINTS

możliwe jest nieco odmien-

ne skonstruowanie klucza głównego poprzez
podanie w nawiasie nazwy kolumny, dla któ-
rej klucz ma być utworzony. Takie rozwiąza-
nie pozwala ponadto na stworzenie wieloko-
lumnowego klucza głównego, co zostało za-
prezentowane w pierwszym poleceniu Listin-
gu 7. Sekcja

CONSTRAINTS

pozwala również

na utworzenie klucza obcego, czyli odwoła-
nia do innej tabeli. Klucz obcy tworzony jest
przy użyciu polecenia

FOREIGN KEY

. Przy-

kład jego zastosowania znajduje się również
na Listingu 7 – w drugim poleceniu. Stwo-
rzono tam odwołanie (klucz obcy) do klucza
głównego innej tabeli.

Sekcja

CONSTRAINTS

pozwala także na

stworzenie indeksu kolumny, poprzez pole-
cenie

UNIQUE

. Oznacza to, że każda z war-

tości w tej kolumny jest w jej obrębie niepo-
wtarzalna. Konsekwencją obecności indeksu
jest to, że kolumna taka musi być obowiąz-
kowo

NOT NULL

. Jeśli nie zostanie to zdefi-

niowane przy tworzeniu samej kolumny in-
terpreter napotykając polecenie

UNIQUE

od-

powiednio zmodyfikuje kolumnę, do której
tworzony jest indeks, domyślnie dodając do
niej ograniczenie

NOT NULL

.

Tabele tekstowe

Od wersji 1.7.0 HSQLDB obsługuje moż-
liwość zapisu danych w tabelach teksto-

wych (typu

TEXT

), to jest takich, w których

dane przechowywane są w pliku w forma-
cie CSV.

Dzięki

warstwie

pośredniczącej

HSQLDB udostępnia wobec takich pli-
ków wszystkie funkcje wynikające z języka
SQL – indeksowanie, klucze główne i ob-
ce, a także łączenie tabel tekstowych oraz
normalnych. Tworzenie tabeli tekstowej nie
różni się niczym od uprzednio zaprezento-
wanych sposobów:

sql> CREATE TEXT TABLE tabela_tekstowa
(kolumna_1 VARCHAR, kolumna_2 INT);

W przypadku tabeli typu

TEXT

, przed rozpo-

częciem pracy z tą tabelą należy wykonać kil-
ka dodatkowych czynności. Przede wszystkim
należy określić plik źródłowy, w którym dane
będą przechowywane. Służy do tego następu-
jąc polecenie:

SET TABLE <nazwa tabeli> SOURCE <nazwa
pliku i opcje>

Nazwa pliku, wraz z opcjami musi zostać za-
pisana w cudzysłowiu. Podstawową opcją, któ-
rą można zdefiniować jest sposób rozdziela-
nia danych w wierszu. Domyślnie jest to prze-
cinek, lecz nic nie stoi na przeszkodzie, aby był
to każdy inny znak. Służy do tego argument

fs

(od field separator):

sql> SET TABLE tabela_tekstowa SOURCE
”plik_tabeli_tekstowej.csv;fs=|”;

Inne opcje pliku tabeli tekstowej przedstawia
Tabela 3.

Modyfikowanie tabeli

Raz utworzoną tabelę można oczywiście zmo-
dyfikować. Służy do tego polecenie

ALTER TA-

BLE

. Jego konstrukcja jest nieco zróżnicowana,

w zależności od tego, co chcemy osiągnąć. Jeśli
chcemy dodać kolumnę, polecenie będzie wy-
glądać następująco:

ALTER TABLE <nazwa tabeli> ADD COLUMN
<definicja kolumny> [BEFORE <istniejąca
kolumna>];

Generalnie składnia polecenia nie wymaga
większych komentarzy, być może poza sło-
wem

BEFORE

. Oznacza ono, że nowa kolumna

zostanie wstawiona przed już istniejącą. Pole-
cenie modyfikacji już istniejącej kolumny wy-
gląda podobnie:

ALTER TABLE <nazwa tabeli> ALTER
COLUMN <definicja kolumny>;

W definicji kolumny definiujemy kolumnę uży-
wając już istniejącej nazwy. Usunięcie kolum-
ny jest jeszcze prostsze:

ALTER TABLE <nazwa tabeli> DROP COLUMN
<nazwa kolumny>;

Bardzo podobnie wygląda polecenie zmiany
nazwy kolumny:

ALTER TABLE <nazwa tabeli> ALTER
COLUMN <nazwa kolumny> RENAME TO <nowa
nazwa>

Istnieje również możliwość zmiany nazwy ca-
łej tabeli:

ALTER TABLE <nazwa_tabeli> RENAME TO
<nowa nazwa>;

Wprowadzanie danych

Mając gotową tabelę nadchodzi czas aby wsta-
wić do niej jakieś dane. W tym celu należy po-
służyć się poleceniem

INSERT INTO TABLES

VALUES

. Przykładowo, wprowadzenie danych

do pierwszej tabeli z Listingu 7 będzie wyglą-
dało następująco:

sql> insert into klient values('Grzeg
orz','Madajczak','Kwiatowa 7/15 Warsza
wa','65111501738');

Można także wprowadzić tekst tylko do po-
jedynczych kolumn, przy czym pozostałe ko-

Listing 8.

Ogólna składnia polecenia SELECT

SELECT

[{LIMIT <offset> <limit> | TOP <limit>}[2]][

ALL

| DISTINCT]

{ selectExpression |

table

.* | * } [, ...]

[

INTO

[CACHED | TEMP | TEXT][2] newTable]

FROM

lista_tabel

[

WHERE

Wyrażenie]

[

GROUP BY

Wyrażenie [, ...]]

[HAVING Wyrażenie]
[{ UNION [

ALL

| DISTINCT] | {MINUS [DISTINCT] | EXCEPT [DISTINCT] } |

INTERSECT [DISTINCT] } selectStatement]
[

ORDER BY

orderExpression [, ...]]

[LIMIT <limit> [OFFSET <offset>]];

Listing 9.

Kod nawiązania połączenia z serwerem HSQLDB w języku JAVA

try{
Class.forName

(

"org.hsqldb.jdbcDriver"

)

.newInstance

()

;

}catch

(

Exception

e

)

{

e.printStackTrace

()

;

return

;

}
Connection conn = DriverManager.getConnection

(

"jdbc:hsqldb:hsql://url_

bazy_danych", "użytkownik", "hasło"

)

;

background image

18

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

19

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

lumny, do których nie wprowadzamy da-
nych muszą mieć dozwoloną wartość

NULL

.

Ponownie za przykład posłuży tabela z Li-
stingu 7:

sql> insert into klient(imie,nazwisko
,pesel) values('Grzegorz','Madajcz
ak','65111501738');

W powyższym poleceniu wprowadzono dane
do trzech kolumn z czterech, wyróżniając ich
nazwy w nawiasie po nazwie tabeli.

Bardzo ciekawą właściwością oferowa-

ną przez bazę danych HSQLDB jest moż-
liwość zapisu w bazie danych danych bi-
narnych, poprzez strumień wchodzący. Ce-
cha ta realizowana jest przez kolumnę ty-
pu

OTHER

(lub

OBJECT

), która jak to wyni-

ka z Tabeli 2, przechowuje dane będące od-
zwierciedleniem klasy

java.lang.Object

z JAVA. Dla nie wtajemniczonych w arka-
na tego języka dodam, że w JAVA obiektem
może być każdy plik, niezależnie czy jest to
plik dźwiękowy, obrazek, czy też inny do-
wolny plik.

Aby zobrazować, jak się dokonuje tej nie-

zbyt skomplikowanej sztuki, posłużę się przy-
kładem. Najpierw należy utworzyć tabelę za-
wierającą kolumnę przechowującą dane ty-
pu

OBJECT

:

sql> create table filetable(id int
generated by default as identity(start
with 0), nazwa_pliku varchar, plik
object);

Następnie należy załadować do bufora plik
który chcemy przechowywać w bazie danych.
Służy do tego polecenie wydane w trybie raw
mode

\bl

, po którym podajemy ścieżkę do-

stępu do pliku. Polecenia te w przeciwieństwie
do poleceń w języku SQL nie kończą się śred-
nikiem.

sql> \bl /tmp/obrazk.jpg

Kolejnym krokiem jest wydanie polecenia

\bp

:

sql> \bp

Na sam koniec ładujemy plik do tabeli, zastę-
pując plik w polu kolumny znakiem zapytania:

sql> insert into filetable(nazwa_
pliku,plik) values('przykładowe
zdjęcie', ?);

Odczyt takiego pliku z tabeli wymaga ponow-
nie użycia trybu raw. Najpierw jednak wyszu-
kujemy plik poleceniem

SELECT

:

sql> select file from filetable where
id=0;

W wyniku tego polecenia plik zostanie zała-
dowany do bufora. Teraz zostało zapisać go na
dysku, stosując polecenie

\bd

wraz ze ścież-

ką do pliku

sql> \bd /tmp/plik.jpg

Odczyt danych z tabeli

Dane z tabel odczytuje się za pomocą polece-
nia

SELECT

, którego ogólną składnię prezentu-

je Listing 8. Chcąc odczytać nazwiska wszyst-
kich klientów zapisanych w tabeli z Listingu
7, wyrażenie przybierze następujący kształt:

sql> select nazwisko from klient;

Efektem działania powyższego polecenia bę-
dzie lista nazwisk. Można ją uporządkować al-
fabetycznie – służy do tego polecenie

ORDER BY

<nazwa_kolumny> [ASC | DESC]:

sql> select imię,nazwisko from klient
order by nazwisko desc;

Efektem działania powyższego polecenia
będzie lista imion i nazwisk klientów, upo-

rządkowana alfabetycznie, malejąco wg na-
zwisk.

Najistotniejszą możliwością pobierania

danych z tabeli jest możliwość ich warunko-
wego wyszukiwania. Służy do tego polece-
nie

WHERE

.

sql> select * from klient where
nazwisko='Madajczak';

Powyższe polecenie zwróci listę danych klien-
tów o nazwisku Madajczak.

Skrypty SQL

Biblioteka hsqldb.jar daje nam również moż-
liwość tworzenia skryptów powłoki, które wy-
korzystywać będą wewnętrzne polecenia na-
pisane w języku SQL – zapytania do bazy da-
nych. Posługujemy się w tym celu znanym już
nam narzędziem SQLTool z przełącznikiem

--sql

, po którym, następuje zapytanie w

SQL. Zapytanie to musi być zapisane pomię-
dzy dwoma apostrofami i obowiązkowo za-
kończone średnikiem. Dla przykładu posłuż-
my się jeszcze raz tabelą z Listingu 7.

$ java -jar hsqldb.jar --sql 'select
* from klient;' urlid

Powyższe polecenie zwróci nam całą zawar-
tość tabeli klient z bazy o identyfikatorze urlid.
Aby to polecenie zadziałało, w pliku konfigu-
racyjnym sqltool.rc musi być prawidłowo zde-
finiowana baza danych. Można również posłu-
żyć się uwierzytelnianiem typu inlineRC. Wte-
dy to powyższe polecenie będzie wyglądało
nieco odmiennie:

$ java -jar hsqldb.jar --sql 'select
* from klient;' --inlineRC URL=jdbc:
hsqldb:hsql://localhost/ścieżka/do/ba
zy,USER=użytkownik,PASSWORD=hasło

W powyższym poleceniu, dla jego prawidło-
wego działania ważne jest, aby przełącznik

sql

Tabela 3.

Opcje zapisu pliku tabeli tekstowej

Opcja

Opis

Wartość domyślna

quoted

Jeśli „

false

”, cudzysłów traktowany jako normalny znak (true lub false)

true

all_quoted

Jeśli „

true

”, dodaje podwójne cudzysłowy do wszystkich pól

false

encoding

Strona kodowa znaków

UTF-8

ignore_first

Jeśli „

true

”, ignorowana jest pierwsza linia (zawiera opisy nagłówków)

true

cache_scale

Przelicznik, do wylicznia liczby przechowywanych wierszy w cache (1 / 100 wierszy)

8

cache_size_scale

Przelicznik do obliczania średniego rozmiaru każdego wiersza w cache. 8 odpowiada 256 bitom na wiersz

8

fs

Separator pola danych

,

vs

Separator łańcucha znakowego (

VARCHAR

)

lvs

Separator długiego łańcucha znakowego (

LONGVARCHAR

)

background image

20

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

znajdował się zaraz za poleceniem

java -jar

hsqldb.jar

, a przed przełącznikiem

inlineRC

.

HSQLDB w JAVA

Jak wspomniałem na samym początku artyku-
łu, HSQLDB jest bazą danych, której silnik zo-
stał napisany w języku JAVA. Naturalne wyda-
je się więc zastosowanie tego silnika do wszyst-
kich aplikacji napisanych w tym języku. Utwo-
rzenie połączenia z bazą HSQLDB odbywa się
za pomocą implementacji klasy

java.sql.Con-

nection

– klasy

org.hsqldb.jdbc.jdbcCon-

nection

. Kod nawiązania połączenia z serwe-

rem prezentuje Listing 9. Dalsze postępowanie,
po uzyskaniu połączenia z bazą, jest takie samo,
jak w przypadku każdej innej bazy obsługiwanej
przez JDBC. Tak na przykład wysłanie zapytania
do, bazy, z którą uzyskano połączenie reprezen-
towane przez Obiekt

Connection conn

(jak na

Listingu 9) będzie wyglądało następująco:

java.sql.Statement st =
conn.createStatement();
java.sql.ResultSet rs =
st.executeQuery("select * from tabela_
1");

Uzyskawszy obiekt

ResultSet

można pobie-

rać na jego podstawie dane z zapytania:

while (rs.next()) {
String s = rs.getString("b");
}

Niemal na samym początku ego artykułu pisa-
łem, że możliwe jest uruchomienie serwera w
trybie In-Process, co oznacza, że działa on ja-
ko część aplikacji działającej w obrębie tej sa-

mej JVM. Takie uruchomienie daje największą
wydajność bazy danych, ponieważ omijane są
potencjalne ograniczenia transmisji danych np.
przez sieć. Uruchomienie bazy danych w trybie
In-Process również odbywa się z wykorzysta-
niem klasy

Connection

:

Connection c = DriverManager.getConne
ction("jdbc:hsqldb:file:testdb", "sa",
"");

Dalej posługujemy się tak uzyskanym połącze-
niem z bazą, jak tym z Listingu 9.

Jak widać z powyższych przykładów, baza

danych z silnikiem HSQLDB jest niemalże ideal-
nym rozwiązaniem dla wszystkich, którzy progra-
mując w języku JAVA zmuszeni są do jakiegokol-
wiek zarządzania danymi. Olbrzymią zaletą bazy
HSQLDB jest możliwość przechowywania w niej
obiektów binarnych, takich jak np. pliki. Istnieje
również możliwość korzystania z bazy danych
HSQDB, której pliki zawarte są w paczce *.jar
aplikacji. Taka baza danych będzie jednak działa-
ła tylko w trybie do odczytu. W celu przygotowa-
nia takiej bazy, należy się przede wszystkim upew-
nić, że żadna z tabel nie jest typu

CACHED

lub

TEXT

,

gdyż wymagają one dostępu do ich plików w try-
bie odczytu i zapisu. Bazie takiej należy nadać
atrybut tylko do odczytu, a następnie zamknąć.

sql> SET READONLY TRUE;
sql> SHUTDOWN;

Po wykonaniu powyższych czynności, w folde-
rze bazy danych należy odszukać jej pliki, a na-
stępnie skopiować do folderu aplikacji pliki z
rozszerzeniem *.properties oraz *.scripts. Chcąc
połączyć się z taką bazą w parametrach połącze-

nia podajemy następujący URL: jdbc:hsqldb:
res:/folder/baza
, w którym to podajemy nazwę
folderu, w którym pliki bazy są zlokalizowane
oraz nazwę (urlid) bazy danych. W adresie tym
dodatek res mówi sterownikowi, że otwieramy
bazę danych znajdującą się w pliku *.jar.

Podsumowanie

Przeprowadzone testy porównawcze dostępnych
baz danych (wolnych, jak i komercyjnych) wyka-
zują, że HSQLDB przoduje wśród nich szybko-
ścią dostępu do przechowywanych danych. Jed-
nak od razu muszę dodać, że testy nie są miaro-
dajne, gdyż domyślnie HSQLDB przechowu-
je tabele w całości w pamięci, co w porówna-
niu do innych baz, przechowujących dane zapi-
sane na dysku, znacznie skraca czas dostępu do
danych. Szybkość działania HSQLDB osiągnięta
dzięki przechowywaniu tabel z danymi w pamię-
ci komputera równoważy poważną wadę aplika-
cji napisanych w JAVA, jaką jest pewna ocięża-
łość działania. Z drugiej zaś strony zmusza to pro-
gramistę, czy też użytkownika bazy do pamięta-
nia, że gromadzenie dużej ilości danych w pamię-
ci może doprowadzić do zmniejszenia szybkości
działania całego systemu, ze względu na brakują-
cą pamięć fizyczną RAM. Pewnym rozwianiem
tego problemu jest zastosowanie tabel typu

CA-

CHED

zamiast domyślnych typu

MEMEORY

. Jednak

w pierwszej sytuacji należy liczyć się ze zmniej-
szeniem się prędkości działania bazy danych, po-
przez potencjalne wydłużenie czasu dostępu do
gromadzonych danych.

Pomimo powyższych, nieznacznych wad,

warto zainteresować się tym projektem. Baza
HSQLDB stanowi bowiem doskonałe rozwiąza-
nie dla małych projektów, gdzie nie ma wymogu
gromadzenia danych w rozbudowanych serwe-
rach bazodanowych. Istotne jest zwłaszcza to, że
HSQLDB może działać z poziomu użytkownika.

Mam pełną świadomość, że artykuł ten nie

wyczerpał tematyki związanej z posługiwaniem
się bazą danych HSQLDB, zwłaszcza w odnie-
sieniu do języka SQL. Jednak informacje zawar-
te pozwolą początkującemu użytkownikowi na
rozpoczęcie pracy z tym projektem. W celu zdo-
bycia większej wiedzy odsyłam zainteresowa-
nych do dobrze napisanej dokumentacji bazy da-
nych zawartej w pakiecie dystrybucyjnym, czy
też na stronie internetowej projektu.

Rysunek 1.

Program DatabaseManager

Autor artykułu, z wykształcenia lekarz wete-
rynarii, mikrobiolog, pasjonuje się Linuksem
od ponad pięciu lat. Jego ulubione dystrybu-
cje to Gentoo i Slackware.
Kontakt z autorem: madajczak@gmail.com

O autorze


Wyszukiwarka

Podobne podstrony:

więcej podobnych podstron