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.
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>
)
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
))
;
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
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
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
są
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
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"
)
;
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
)
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