2009 02 Relacyjna baza danych HSQLDB [Bazy Danych]


Dla początkujących
Relacyjna baza danych HSQLDB
Relacyjna baza
danych HSQLDB
Grzegorz Madajczak
Ś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.
śród wielu użytkowników systemu Li- Ogólne informacje
nux panuje przekonanie, że zawsze trze- HSQLDB jest relacyjną bazą danych powstałą w oparciu
ba mieć najlepsze, najnowsze, najbardziej o języki JAVA oraz XML. Połączenie tych dwóch technik
Wrozbudowane programy. Działają zgodnie sprawia, że otrzymujemy proste w obsłudze i w miarę wy-
z zasadą  jeśli mam to za darmo, to czemu nie mam mieć dajne narzędzie do zarządzania danymi. Zwolennicy Wol-
najlepszego. Nie jest ważne, że pózniej używają jedynie 10% nego Oprogramowania, nie koniecznie użytkownicy sys-
możliwości oprogramowania oraz gubią się w gąszczu opcji temu Linux, z dużym prawdopodobieństwem mieli oka-
i możliwości. zję nieświadomie zetknąć się z HSQLDB, jako silnikiem
Podobnie jest z dostępnymi silnikami bazodanowy- bazodanowym w pakiecie OpenOffice.org  zwłaszcza w
mi. Użytkownik, czy też bardziej deweloper innej aplikacji programie OOo Base. Choćby to zastosowanie jest wspa-
używa rozbudowanego serwera, np. MySQL, aby stworzyć niałą rekomendacją dla opisywanego projektu...
program do katalogowania płyt z domowej audioteki. Nie Baza danych HSQLDB rozpowszechniana jest na
rozumie, że nie zawsze trzeba stosować rozbudowane roz- podstawie licencji BSD (Berkeley Software Distribu-
wiązania  serwery bazodanowe, takie jak MySQL, Post- tion). Nie wdając się w szczegóły różniące licencje GPL
greSQL, czy Oracle do najprostszych, a nawet tych bardziej i BSD, przypominam, że licencja typu BSD skupia się
skomplikowanych potrzeb. Nie rozumie, że zamiast nich na prawach autorskich. Jest bardzo liberalna, zezwala nie
może posłużyć się dobrymi i prostymi  nie tak rozbudowa- tylko na modyfikacje kodu i jego rozprowadzanie w ta-
nymi programami. Proste nie oznacza bowiem, że są pozba- kiej postaci, ale także na rozprowadzanie produktu bez
wione jakiejś funkcjonalności. Dobrym przykładem na pro- postaci zródłowej czy wręcz włączenia do zamknięte-
ste narzędzie do gromadzenia i zarządzania danymi jest re- go oprogramowania pod warunkiem załączenia do pro-
lacyjna baza danych HSQLDB. Czym są relacyjne bazy da- duktu informacji o autorach oryginalnego kodu i treści
nych przedstawia Ramka Relacyjne bazy danych. licencji.
12 luty 2009
linux@software.com.pl
Dla początkujących
Relacyjna baza danych HSQLDB
Pakiet dystrybucyjny proces aplikacji (In-Process Mode). Tryb ser- tego artykułu, który został poświęcony zastoso-
Baza danych HSQLDB dystrybuowana jest w wera oferuje maksimum wydajności i możli- waniu HSQLDB w programach JAVA.
jednej wersji  niezależnej od platformy syste- wości. Silnik bazodanowy pracuje w przestrze- Dostępne są trzy różne formy serwera baz
mowej  w postaci zzipowanego pakietu, który ni wirtualnej maszyny JAVA (JVM  JAVA Vir- danych, oferujące różne protokoły komunika-
zawiera następujące foldery: tual Machine), nasłuchując połączeń wywoły- cji pomiędzy klientem, a serwerem. Pierw-
wanych przez programy uruchomione na tym sza z form to tradycyjna baza danych, któ-
" bin, który zawiera skrypty dla systemu samym komputerze lub na innych kompute- ra zapewnia jednocześnie największą wydaj-
Linux oraz plik wykonywalny MSDOS rach w sieci. Różne programy mogą jednocze- ność. Najprostszą formą jej uruchomienia bę-
 służące do uruchomienia narzędzi śnie połączyć się z bazą danych w celu uzyska- dzie wykonanie w terminalu następującego
HSQLDB; nia lub przesłania informacji (danych), łącząc polecenia:
" build, który zawiera plik build.xml dla me- się z bazą danych za pomocą sterownika JDBC
chanizmu ANT, a także plik wykonywalny HSQLDB. W trybie tym serwer baz danych $ java -cp ścieżka_dostępu/hsqldb.jar
MSDOS  obydwa służące do samodziel- może obsługiwać jednocześnie do 10 baz da- org.hsqldb.Server -database.0 file:
nego zbudowania ze zródeł HSQLDB nych.Więcej na temat drugiego trybu (In-Pro- ścieżka_dostępu/moja_baza -dbname.0
(więcej informacji na ten temat znajduje cess) będzie można dowiedzieć się z rozdziału moja_baza
się w pliku readmebuild.txt);
" classes, zawierający pliki *.class wygene- Listing 1. Kod przykładowego pliku server.properties
rowane za pomocą ANT; # Przykładowy plik serwera HSQDB
" demo, który zawiera przykładowe skryp- server.database.0 file:ścieżka_dostępu;ifexists=true
ty dla systemu Linux oraz pliki wykony- server.dbname.0 nazwa_bazy_danych
walne systemu MSDOS, służące do uru- server.port 9001
chamiania narzędzi HSQLDB oraz samej
bazy danych HSQLDB. Znajduje się tam Listing 2. Pojedyncza sekcja pliku konfiguracyjnego narzędzia SQLTool  sqltool.rc
również kilka przykładów dokumentów urlid test_hsqldbase
HTML, w których HSQLDB osadzone url jdbc:hsqldb:hsql://localhost/ścieżka_dostępu
jest w postaci apletu; username nazwa_użytkownika
" doc, zawierającego zestaw dokumentów password hasło_użytkownika
HTML, PDF oraz dokumentów teksto-
wych ( w formacie *.txt) opisujących w Listing 3. Uwierzytelnianie metodą inlineRC podczas łączenia się z serwerem
miarę szczegółowo różne aspekty korzy- $ java -jar $HSQLDB_HOME/lib/hsqldb.jar --inlineRC
stania z HSQLDB oraz różne narzędzia tej URL=jdbc:hsqldb:hsql://localhost/ścieżka_dostępu,
bazy; USER=nazwa_użytkownika,
" lib, w którym zwarte są pakiety binar- PASSWORD=hasło_użytkownika
ne hsqldb.jar oraz severlet.jar służące od-
powiednio do uruchomienia bazy danych Listing 4. Ogólna składnia definicji kolumny tabeli
oraz serwera sieciowego HSQLDB; nazwa_kolumny typ_danych [(wielkość kolumny)]
" src, w którym zgromadzone są pliki zró- [{DEFAULT |
dłowe *.java służące do samodzielne- GENERATED BY DEFAULT AS IDENTITY
go zbudowania pakietów binarnych (START WITH [, INCREMENT BY ])}] |
HSQLDB. [[NOT] NULL] [IDENTITY] [PRIMARY KEY]
Pobrany z internetu pakiet dystrybucyjny (do- Listing 5. Przykładowe polecenie utworzenia tabeli
stępny pod adresem http://www.hsqldb.org), sql> create text table kontrahenci(
wystarczy rozpakować na dysku. Tak przy- id int generated by default as identity(start with 0) not null primary
gotowany pakiet jest gotowy do użycia  nie key,
wymaga jakichkolwiek innych czynności in- imie varchar(50) not null,
stalacyjnych. Bazą danych HSQLDB mo- nazwisko varchar(100) not null,
żemy posługiwać się również w przestrze- firma varchar(200) not null);
ni użytkownika  bez konieczności posiada-
nia uprawnień administratora systemu. Wy- Listing 6. Ogólna składnia definicji ograniczeń
starczy rozpakować pakiet i już można go [CONSTRAINT ]
użytkować. UNIQUE ( [,...] ) |
PRIMARY KEY ( [,...] ) |
Uruchomienie FOREIGN KEY ( [,...] )REFERENCES serwera baz danych referencji> ( [,...])
Baza danych HSQLDB może być uruchomiona [ON {DELETE | UPDATE}
na kilka różnych sposobów. Generalnie rzecz {CASCADE | SET DEFAULT | SET NULL}] |
ujmując, sposoby te można podzielić dwoja- CHECK()
ko: tryb serwera (Server Mode) oraz praca jako
www.lpmagazine.org 13
Dla początkujących
Relacyjna baza danych HSQLDB
Powyższe polecenie tworzy i uruchamia bazę Inną formą bazy danych jest serwer sie- temie zmienną JAVA_HOME. Najlepiej dokonać
danych o nazwie moja_baza. Należy zwrócić ciowy, który do komunikacji z klientem wy- tego wydając w konsoli następujące polecenie:
uwagą na dwa argumenty tego polecenia. War- korzystuje protokół HTTP. Przykładem wy-
tość pierwszego z nich  database.0 to ścież- korzystania tego rozwiązania są sytuacje na- $ env | grep JAVA_HOME
ka dostępu do pliku tworzonej bazy danych. rzucane przez ograniczenia zapory sieciowej,
Drugi argument  dbname.0 określa alias (na- która nie przepuszcza innej komunikacji, jak Przy braku odpowiedzi, należy sprawdzić,
zwę) bazy danych. Nazwą tą będziemy posłu- przez port 80. Należy jednak pamiętać, iż ser- gdzie w naszym systemie znajdują się pliki ma-
giwali się póznej wielokrotnie łącząc się z ba- wer sieciowy nie oferuje tej samej wydajno- szyny wirtualnej JAVA. Wydajemy w tym ce-
zą danych. ści, co zwykły serwer. Uruchomienie serwera lu polecenie, które odnajdzie nam wykonywal-
Zaglądając do folderu, w którym umieści- sieciowego HSQLDB nie różni się zbytnio od ny plik java:
liśmy nowoutworzoną bazę danych, zobaczy- opisanych wcześniej metod.
my, że pojawiły się tam dwa nowe pliki: mo- $ whereis java
ja_baza.properties oraz moja_baza.log. Są to $ java -cp ścieżka_dostępu/hsqldb.jar
pliki utworzonej bazy danych. Pierwszy z nich org.hsqldb.WebServer -database.0 Istnieje duże prawdopodobieństwo, że pomo-
 z rozszerzeniem *.properties zawiera infor- file:ścieżka_dostępu/moja_baza_web - że to ustalić lokalizację JVM. Posiadając taką
macje o ogólnych ustawieniach bazy danych. dbname.0 moja_baza_web wiedzę należy zdefiniować zmienną JAVA_HO-
Natomiast plik z rozszerzeniem *.log zawie- ME, stosując polecenie export:
ra informacje o zmianach wprowadzanych do Podobnie, jak i w poprzednich przykładach
bazy danych. możliwe jest uruchomienie serwera sieciowego $ export JAVA_HOME; JAVA_HOME=/usr/
Zaprezentowane powyżej rozwiązanie wy- HSQLDB działającego tylko w pamięci opera- java/j2sdk1.6.0
korzystuje bazę danych zapisaną w kilku pli- cyjnej komputera:
kach zapisanych na dysku  według wskazanej Następnie należy odpowiednio zmodyfiko-
ścieżki dostępu. Istnieje jednak możliwość uru- $ java -cp ścieżka_dostępu/hsqldb.jar wać zmienną CLASSPATH, tak aby wskazywa-
chomienia serwera bazy danych, który będzie org.hsqldb.WebServer -database.0 mem: ła ścieżkę dostępu do folderu zawierającego
działał tylko w pamięci operacyjnej kompute- moja_baza_web -dbname.0 moja_baza_web plik hsqldb.jar:
ra  tymczasowo. Oznacza to, że po zamknię-
ciu serwera dane zgromadzone w takiej bazie Instalacja serwera $ export CLASSPATH; CLASSPATH=ścieżka_
zostaną bezpowrotnie utracone. W celu urucho- baz danych HSQLDB dostępu_do_hsqldb.jar
mienia takiego serwera HSQLDB wykonujemy Opisane powyżej przykłady pokazują, w ja-
w konsoli następujące polecenie: ki sposób szybko uruchomić serwer HSQLDB. Ostatnim zadaniem będzie utworzenie pli-
Ich wadą jest to, że przy każdym starcie syste- ku właściwości bazy danych HSQLDB  se-
$ java -cp ścieżka_dostępu/hsqldb.jar mu trzeba powtarzać te same czynności. Moż- rver.properties, który musi znalezć się w ka-
org.hsqldb.Server -database.0 mem: na jednak tak przygotować nasz system, aby ba- talogu domowym użytkownika bazy danych.
in_memdb -dbname.0 in_memdb za danych HSQLDB startowała automatycznie Przykładowy plik *.properties znajduje się
jako proces działający w tle. W tym celu uprzed- w pakiecie dystrybucyjnym HSQLDB wśród
W stosunku do uprzednio przedstawionego nio pobrany zzipowany pakiet, zawierający bi- innych plików zródłowych (ścieżka dostępu:
rozwiązania, różnica polega na zastosowaniu narne pliki serwera baz danych, należy rozpako- src/org/hsqldb/sample/sample-server.proper-
przedrostka mem: zamiast file jako wartości ar- wać do dowolnego folderu. Kolejnym krokiem ties). Nic nie stoi jednak na przeszkodzie, aby
gumentu -database.0. jest sprawdzenie czy mamy zdefiniowaną w sys- plik ten utworzyć samodzielnie. Przykładowy
plik server.properties przedstawiony został na
Listing 7. Tworzenie tabeli z wielokolumnowym kluczem głównym oraz tabeli z kluczem obcym
Listingu 1, a opis właściwości pliku konfi-
sql> create table klient( guracyjnego, wraz z wartościami domyślny-
imie varchar(50) not null, mi przedstawia Tabela 1. Pierwsze dwa wier-
nazwisko varchar(100) not null, sze Listingu zawierające opcje konfiguracyjne
adres varchar(150), serwera HSQLDB nie wymagają komentarza
pesel varchar(11),  mają taką samą funkcję, jak argumenty po-
unique(pesel), dawane w linii poleceń podczas ręcznego uru-
primary key(imie, nazwisko)); chamiania serwera. Jedyną różnicą jest argu-
ment ifexist=true w pierwszej linii opcji.
sql> create table firmy( Argument ten oznacza, że baza danych ma
id int generated by default as identity(start with 0), być uruchomiona niezależnie od tego, czy plik
wlasciciel_imie varchar, podany w ścieżce dostępu istnieje, czy też nie.
wlasciciel_nazwisko varchar, W przypadku braku pliku zostanie utworzona
adres_firmy varchar, nowy serwer, w nowych plikach, o podanej
nip varchar(10), ścieżce dostępu. Wartość true jest wartością
konto varchar(26), domyślą. Jej przeciwieństwo (ifexist=fal-
foreign key(wlasciciel_imie, wlasciciel_nazwisko) references se) oznacza, że przy braku wskazanego pliku
klient(imie, nazwisko)); serwer nie zostanie uruchomiony. Natomiast
ostatni wiersz określa port na którym serwer
14 luty 2009
Dla początkujących
Relacyjna baza danych HSQLDB
będzie nasłuchiwał  domyślnie jest to 9001 ka SQL  SQLTool. Jest to narzędzie uru- JDBC, następnie po dwukropku identyfikato-
lub 554 dla połączenia szyfrowanego TLS. chamiane i działające z linii poleceń, przez ra sterownika JDBC oraz na końcu, także po
Ostatnią czynnością będzie uruchomie- co może być używany na przykład zdalnie dwukropku, właściwego URL. W przypadku
nie procesu serwera bazy danych HSQLDB,  poprzez połączenie SSH. Dodatkową za- sterownika hsqldb należy jeszcze określić,
za pomocą polecenia nohup, które sprawi, że letą SQLTool jest możliwość używania nie czy mamy do czynienia z bazą danych w pli-
rozpoczęty w ten sposób wątek będzie dzia- tylko w odniesieniu do HSQLDB, lecz do ku (file:), czy też zlokalizowaną w pamię-
łał w tle. każdej innej bazy danych, która posiada ste- ci (mem:). Następne dwa wiersze sekcji okre-
rownik JDBC. ślają kolejno nazwę użytkownika oraz hasło
$ nohup java org.hsqldb.Server & Narzędzie SQLTool wymaga do dzia- dostępu do serwera. Inne opcje, które mogą
łania JVM firmy Sun w wersji 1.4 lub póz- znalezć się w sekcji konfiguracyjnej to:
Aby przekonać się, że serwer działa w tle można niejszej. Autorzy projektu sumiennie zazna-
wydać polecenie ps, listujące aktywne procesy. czają, iż program ten nie był testowany na in- " charset  określająca stronę kodową zna-
nych wersjach JVM, niż oryginalny produkt ków, stosowaną przez narzędzie SQLTool;
$ ps -A | grep hsqldb.jar firmy Sun, więc możliwe jest, że w przy- " driver  określająca klasę sterownika
padku innych odmian JVM, jak na przykład JDBC dla konfigurowanego serwera;
Niemalże identycznie należy postępować Blackdown Java, czy IBM Java mogą wystą- " truststore  określająca ścieżkę dostępu
w przypadku uruchamiania serwera siecio- pić trudne do przewidzenia nieprawidłowości do pliku zawierającego klucz stosowany w
wego HSQLDB. Różnica polega na tym, że działania programu. szyfrowanym połączeniu z serwerem TLS.
plik konfiguracyjny serwera sieciowego to Przed rozpoczęciem pracy z SQLTool w
oczywiście webserver.properties z właści- katalogu domowym użytkownika musi zna- Jak łatwo zauważyć stosowanie pliku konfigu-
wościami o przedrostku server, z dwoma lezć się plik konfiguracyjny sqltool.rc. Przykła- racyjnego sqltool.rc ma jedną zasadniczą wa-
dodatkowymi właściwościami: server.de- dową wersję tego pliku można znalezć w pa- dę. Na dysku komputera zostają zapisane nie
fault_page  definiującą domyślną stronę kiecie dystrybucyjnym HSQLDB w folderze chronione w jakikolwiek sposób poufne dane
dla serwera oraz server.root  określającą src/org/hsqldb/sample. W pliku tym znajdują  adresy, loginy i hasła do serwerów baz da-
lokalizację plików serwera. W tym wypadku się przykładowe konfiguracje zarówno do ob- nych. Jeśli korzystamy z SQLTool dla potrzeb
uruchamiany jest program org.hsqldb.We- sługi serwera HSQLDB, jak i innych serwerów lokalnej bazy danych na domowym kompute-
bServer. bazodanowych. rze, to rozwiązanie takie może nawet ujść. Jest
W pakiecie dystrybucyjnym bazy da- Plik ten składa się z sekcji, które opisują ono jednak nie do zaakceptowania w środowi-
nych HSQLDB znajduje się również przy- konfiguracje dla poszczególnych serwerów, z skach produkcyjnych  stwarza zbyt wysoki
kładowy skrypt systemu init  hsqldb, któ- których można korzystać za pośrednictwem ryzyko przejęcia kontroli nad zasobami, któ-
ry po skopiowaniu do folderu /etc/init.d lub narzędzia SQLTool. Przykładowa sekcja pli- re powinny być chronione.
/etc/rc.d/init.d (różnie w zależności od dys- ku sqltool.rc została przedstawiona na Listin- Z powyższych względów SQLTool
trybucji, wymagane są uprawnienia admini- gu 2. Identyfikator konfiguracji określony umożliwia łączenie się z serwerem i uwie-
stratora systemu), pozwala na automatyczny jest jako wartość argumentu urlid. W kolej- rzytelnianie stosując metodę inlineRC. Me-
start serwera HSQLDB podczas uruchamia- nym wierszu znajduje się wartość argumen- toda ta polega na podaniu w linii poleceń
nia systemu. Skrypt ten znajduje się w fol- tu url określająca oczywiście adres serwera wszystkich informacji,niezbędnych do uzy-
derze bin pakietu instalacyjnego. Ponadto w baz danych. Dla niezaznajomionych z inter- skania połączeni z serwerem, już na etapie
folderze src/org/hsqldb/sample/ znajduje się fejsem JDBC, wyjaśniam, że adres ten skła- uruchamiania polecenia sqltool. Stosuje-
opatrzony bogatymi i czytelnymi komenta- da się z wywołania warstwy pośredniczącej my w tym celu przełącznik --inlineRC. Po-
rzami plik sample-hsqldb.cfg, w którym za-
warta jest podstawowa konfiguracja syste- Tabela 1. Właściwości serwera HSQLDB
mowa serwera HSQLDB. Obejmuje ona ta-
Właściwość Wartość domyślna Opis cechy
kie informacje, jak lokalizacja JAVA, czy pa-
Właściwości serwera i serwera sieciowego
kietu HSQLDB. Plik ten należy samodzielnie
server.database file:ścieżka_do-
Ścieżka dostępu do plików serwera
zmodyfikować, a następnie umieścić w tym
stępu
samym miejscu, co skrypt systemu init. W
mem:baza_danych
Plik serwera zlokalizowany w pamięci komputera
folderze domowym root-a powinny znalezć
server.dbname
Nazwa (alias) bazy danych
się dwa pliki  plik server.properties, będą-
server.port 9001
Port, na którym serwer nasłuchuje połączeń od klienta
cy kompilacją potencjalnych plików *.pro-
554 (TLS)
perties konkretnych baz danych (zawiera te
80 (WebServer)
same dane kolejno dla każdego z serwerów)
server.silent true
Cichy tryb serwera (minimalna ilość komunikatów)
oraz plik sqltool.rc, który zostanie omówiony
w następnym rozdziale artykułu.
Właściwości tylko serwera
server.no_sys- true
Nie wywołuje metody System.exit() przy zamknię-
Dostęp do bazy
tem_exit
ciu serwera
danych  SQLTool
Właściwości tylko serwera sieciowego
Silnik bazodanowy HSQLDB dostarcza
server.default_page index.html
Domyślny dokument serwera
własne narzędzie służące do zarządzania
server.root ./
Domyślna lokalizacja plików serwera
serwerem i danymi bazy za pomocą języ-
www.lpmagazine.org 15
Dla początkujących
Relacyjna baza danych HSQLDB
łączenie tą metodą z serwerem opisanym w Powyższe polecenie uruchamia narzędzie ATE USER, którego ogólna składnia wyglą-
treści pliku sqltool.rc z Listingu 2, przedsta- napisane w AWT. Jeśli chcemy urucho- da następująco:
wiono na Listingu 3. Oprócz zaprezentowa- mić program napisany z użyciem bibliote-
nych na listingu trzech podstawowych wła- ki Swing, polecenie będzie wyglądało na- CREATE USER
ściwości, dodatkowo, po przecinkach, moż- stępująco: PASSWORD [ADMIN];
na również określić stronę kodową znaków
(CHARSET) oraz plik zawierający klucz TLS $ java -cp lib/hsqldb.jar org.hsqldb. W miejscach oraz
(TRUST). util.DatabaseManagerSwing wprowadzamy odpowiednie infor-
Metoda uwierzytelniania inlineRC charak- macje. Słowo kluczowe ADMIN na końcu po-
teryzuje się również interaktywnością. Ozna- Program DatabaseManager (Rysunek 1) jest ła- lecenia oznacza, że nowotworzonemu użyt-
cza, to, że gdy podamy jedynie URL, program twym w użyciu, intuicyjnym narzędziem, dzię- kownikowi nadajemy prawa administrato-
podczas logowania zapyta się nas o niezbędne ki któremu możemy łączyć się z różnymi ba- ra bazy danych. Tak więc przykładowe pole-
brakujące informacje  nazwę użytkownika i zami danych, z możliwością zapisywania usta- cenie tworzące użytkownika gmad z hasłem
przypisane mu hasło. wień dla każdej bazy danych. 123456abc, który posiada uprawnienia admi-
nistratora wygląda następująco:
Graficzne Zarządzanie
narzędzie do zarządzania bazą użytkownikami bazy danych sql> CREATE USER gmad PASSWORD
W pakiecie dystrybucyjnym HSQLDB oprócz Nowoutworzona baza danych zawiera do- 123456abc ADMIN;
omawianego powyżej narzędzia SQLtool myślnego użytkownika sa z prawami admi-
znajduje się również program napisany w JA- nistratora, który nie ma jednak przypisanego Raz nadane hasło może być zmienione za po-
VA służący do zarządzania bazą danych. De- hasła. Dlatego też zaraz po zalogowaniu się mocą polecenia ALTER USER o następującej bu-
weloperzy dostarczają dwie wersje tego same- do serwera, dobrze jest nadać użytkowniko- dowie:
go narzędzi  jedną napisaną z użyciem biblio- wi sa hasło, stosując powyższe polecenie w
tek AWT, druga zaś wersja wykorzystuje bi- języku SQL: ALTER USER SET
blioteki Swing. PASSWORD ;
Obie wersje nie różnią się niczym w swej sql> set password  nowe_hasło ;
funkcjonalności. Różnica polega jedynie na Uprawnienia użytkownika mogą być modyfi-
wyglądzie interfejsu  odmiennym ze względu Należy pamiętać, aby po wprowadzeniu tej kowane przez administratora serwera za pomo-
na rodzaj użytej biblioteki. zmiany zmodyfikować odpowiednio plik cą polecenia GRANT, którego ogólna struktura
Uruchomienie obu wersji programu jest sqltool.rc. Jednak posługiwanie się na co wygląda następująco:
podobne: dzień kontem administratora nie jest do-
brym rozwiązaniem. Dlatego warto jest GRANT { SELECT | DELETE | INSERT |
$ java -cp hsqldb.jar cp org.hsqldb.u stworzyć dodatkowego użytkownika bazy UPDATE | ALL } [,...]
til.DatabaseManager danych. Dokonujemy tego poleceniem CRE- ON { table | CLASS "package.class" }
TO ;
Chcąc nadać użytkownikowi o nazwie gmad
Język SQL
uprawnienia do pobierania danych oraz wsta-
SQL (Structured Query Language)  strukturalny język zapytań używany do tworzenia, mo- wiania danych do tabeli o nazwie tabela_1 po-
dyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych. Język lecenie to przyjmie następujący kształt:
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ą- sql> grant select,insert on tabela_1
ce się silniki bazodanowe, uzyskując liczne odmiany. to gmad;
Oczywiście istnieje możliwość odebrania
wcześniej przyznanych uprawnień. Służy do
Relacyjne bazy danych
tego polecenie REVOKE, o następującej składni:
Relacyjne bazy danych wyróżniają się wśród innych typów (np. kartotekowe, obiekto-
REVOKE { SELECT | DELETE | INSERT |
we, hierarchiczne, & ), że tablice w niej zawarte mogą być ze sobą wzajemnie powią-
UPDATE | ALL } [,...]
zane (np. wymieniać się informacjami dzięki kluczom obcym). Bazy takie korzystają z
ON { table | CLASS "package.class" }
języków programowania, zwykle SQL, za pomocą których dana baza jest obsługiwa-
FROM ;
na. W bazach takich dane gromadzone są w postaci dwuwymiarowych tabel (nazywa-
nych relacjami), które obowiązkowo muszą zawierać przynajmniej jedną kolumnę (atry-
Odebranie użytkownikowi gmad uprzednio
but) oraz mogą zawierać zero lub więcej wierszy (inaczej  krotek). Istotne jest to, że
nadanych uprawnień będzie wyglądało nastę-
z braku możliwości identyfikacji wiersza przez jego pozycję, konieczna jest obecności
pująco:
przynajmniej jednej niepowtarzalnej w obrębie całej tabeli kolumny, która pozwala od-
nalezć konkretny wiersz. Kolumnę taką określa się jako klucz podstawowy (ang. pri-
sql> revoke select,insert on tabela_1
mary key) tabeli.
from gmad;
16 luty 2009
Dla początkujących
Relacyjna baza danych HSQLDB
Oczywiście można również usunąć użytkowni- typy danych używane w HSQLD prezentu- KEY. Pojęcia NULL i NOT NULL definiują, czy
ka bazy danych. Służy do tego polecenie DROP je Tabela 2. możliwe jest przechowywanie wartości pu-
USER o następującej składni: Tworząc tabelę zaraz na samym począt- stych. Jeśli chcemy aby kolumna obowiąz-
ku należy zdecydować, w jaki sposób da- kowo zawierała dane  należy ustawić war-
DROP USER . na tabela będzie przechowywana. Domyśl- tość NOT NULL. Próba wprowadzenia war-
nym typem są tabele przechowywane w pa- tości pustej wywoła błąd. Kolumny z usta-
Tak więc usunięcie domyślnego użytkownika mięci (typ MEMORY). Całość ich struktury i wioną wartością IDENTITY gromadzą iden-
sa (czynność, do której gorąco namawiam po danych przechowywane są w pamięci kom- tyfikatory dla wprowadzonej krotki danych.
stworzeniu własnego administratora) wygląda putera, lecz wszelkie zmiany zachowywa- Kolumna ta obowiązkowo musi mieć typ
następująco: ne są na dysku w postaci pliku bli>.script. Przy kolejnym otwarciu tabeli wuje jedynie wartości nie-puste (NOT NULL).
sql> DROP USER sa; wszelkie zmiany wprowadzone do niej są au- Ponadto kolumna z wartością IDENTITY
tomatyczne w prowadzane do tabeli otwartej charakteryzuje się automatycznym przyro-
Tworzenie tabeli w pamięci. Podobne do tabel typu MEMEORY są stem za każdą wprowadzaną krotką danych.
Jakakolwiek baza danych nie może prawidło- tabele typu CACHED, które również przecho- Możliwe jest określenie wartości początko-
wo funkcjonować bez tabel gromadzących da- wywane są w pamięci, lecz jedynie w po czę- wej tej kolumny stosując polecenie START
ne. Utworzenie nowej tabeli w HSQLDB nie ści  część danych, indeksy. Ten typ tabeli ma WITH , lecz definicja takiej kolumny wy-
różni się znacząco od sposobów realizacji te- zastosowanie w odniesieniu do bardzo du- gląda nieco inaczej  tak, jak na przykładzie
go zadania w innych silnikach bazodanowych, żych tabel, które zajęłyby w pamięci znaczną zaprezentowanym na Listingu 5. Zastoso-
obsługujących SQL. Służy do tego polecenie jej przestrzeń. Tabela typu TEMP jest również wanie polecenia IDENTITY() zwraca ostat-
CREATE TABLE, o następującej składni: przechowywana tylko w pamięci, z tą różnicą nią wartość kolumny z wartością IDENTITY
w odniesieniu do tabeli typu MEMORY, że obo- wprowadzoną w bieżącym połączeniu. Na-
CREATE [MEMORY|CACHED|[GLOBAL]TEMPORA wiązuje ona jedynie na czas bieżącego połą- tomiast pojęcie PRIMARY KEY oznacza uni-
RY|TEMP|TEXT] TABLE czenia i po jego zamknięciu zostaje automa- kalny klucz główny tabeli  służący indek-
( [, ...] [, tycznie usunięta. Natomiast tabele typu TEXT sowaniu tabeli, co przyśpiesza jej przeszu-
...] ) charakteryzują się tym, że zapisywana są na kiwanie. Kolumna PRIMARY KEY obowiąz-
[ON COMMIT {DELETE | PRESERVE} ROWS]; dysku w pliku tekstowym CSV. kowo musi być NOT NULL oraz tabela mo-
Istnieją pewne ograniczenia w stosun- że mieć tylko jeden klucz główny, choć mo-
Najważniejszym elementem, który jednocze- ku do wyboru typu tabel. Jeśli utworzona ba- że być złożony z wielu kolumn. Listing 5
śnie sprawia początkującym użytkownikom za danych istnieje tylko w pamięci (typ mem), przedstawia przykładową definicję tabeli z
najwięcej kłopotu jest definicja kolumny. jedyną dozwolonym typem tabeli jest MEMO- czterema kolumnami, z których jedna jest
Ogólny schemat tej definicji przedstawia Li- RY. Tabela typu CASHED zostanie przekształco- identyfikatorem.
sting 4. Istotnym elementem definicji kolum- ne na tabelę typu MEMORY. Polecenie utworze- Analizując ogólną składnię polecenia
ny jest prawidłowy dobór typu danych. Oso- nia tabeli typu TEXT zostanie w tym przypad- tworzenia tabeli, na samym jej końcu znaj-
bom zaznajomionym z językiem JAVA typy ku odrzucone. duje się nieobowiązkowa sekcja danych nie sprawią kłopotu, gdyż są one bez- W sekcji dotyczącej definicji kolum- ograniczeń>, która pozwala na dodawanie
pośrednim odniesieniem do typów danych ny wyjaśnienia wymagają słowa kluczowe lub usuwanie ograniczeń w stosunku do ta-
stosowanych w tym języku. Najważniejsze NULL / NOT NULL, IDENTITY oraz PRIMARY 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
Aań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
www.lpmagazine.org 17
Dla początkujących
Relacyjna baza danych HSQLDB
stawiona na Listingu 6. Część z obecnych wych (typu TEXT), to jest takich, w których Inne opcje pliku tabeli tekstowej przedstawia
tam opcji została omówiona już wcześniej, dane przechowywane są w pliku w forma- Tabela 3.
np. tworzenie klucza głównego tabeli przy cie CSV.
zastosowaniu PRIMARY KEY. Wewnątrz sek- Dzięki warstwie pośredniczącej Modyfikowanie tabeli
cji CONSTRAINTS możliwe jest nieco odmien- HSQLDB udostępnia wobec takich pli- Raz utworzoną tabelę można oczywiście zmo-
ne skonstruowanie klucza głównego poprzez ków wszystkie funkcje wynikające z języka dyfikować. Służy do tego polecenie ALTER TA-
podanie w nawiasie nazwy kolumny, dla któ- SQL  indeksowanie, klucze główne i ob- BLE. Jego konstrukcja jest nieco zróżnicowana,
rej klucz ma być utworzony. Takie rozwiąza- ce, a także łączenie tabel tekstowych oraz w zależności od tego, co chcemy osiągnąć. Jeśli
nie pozwala ponadto na stworzenie wieloko- normalnych. Tworzenie tabeli tekstowej nie chcemy dodać kolumnę, polecenie będzie wy-
lumnowego klucza głównego, co zostało za- różni się niczym od uprzednio zaprezento- glądać następująco:
prezentowane w pierwszym poleceniu Listin- wanych sposobów:
gu 7. Sekcja CONSTRAINTS pozwala również ALTER TABLE ADD COLUMN
na utworzenie klucza obcego, czyli odwoła- sql> CREATE TEXT TABLE tabela_tekstowa [BEFORE nia do innej tabeli. Klucz obcy tworzony jest (kolumna_1 VARCHAR, kolumna_2 INT); kolumna>];
przy użyciu polecenia FOREIGN KEY. Przy-
kład jego zastosowania znajduje się również W przypadku tabeli typu TEXT, przed rozpo- Generalnie składnia polecenia nie wymaga
na Listingu 7  w drugim poleceniu. Stwo- częciem pracy z tą tabelą należy wykonać kil- większych komentarzy, być może poza sło-
rzono tam odwołanie (klucz obcy) do klucza ka dodatkowych czynności. Przede wszystkim wem BEFORE. Oznacza ono, że nowa kolumna
głównego innej tabeli. należy określić plik zródłowy, w którym dane zostanie wstawiona przed już istniejącą. Pole-
Sekcja CONSTRAINTS pozwala także na będą przechowywane. Służy do tego następu- cenie modyfikacji już istniejącej kolumny wy-
stworzenie indeksu kolumny, poprzez pole- jąc polecenie: gląda podobnie:
cenie UNIQUE. Oznacza to, że każda z war-
tości w tej kolumny jest w jej obrębie niepo- SET TABLE SOURCE ALTER
wtarzalna. Konsekwencją obecności indeksu pliku i opcje> COLUMN ;
jest to, że kolumna taka musi być obowiąz-
kowo NOT NULL. Jeśli nie zostanie to zdefi- Nazwa pliku, wraz z opcjami musi zostać za- W definicji kolumny definiujemy kolumnę uży-
niowane przy tworzeniu samej kolumny in- pisana w cudzysłowiu. Podstawową opcją, któ- wając już istniejącej nazwy. Usunięcie kolum-
terpreter napotykając polecenie UNIQUE od- rą można zdefiniować jest sposób rozdziela- ny jest jeszcze prostsze:
powiednio zmodyfikuje kolumnę, do której nia danych w wierszu. Domyślnie jest to prze-
tworzony jest indeks, domyślnie dodając do cinek, lecz nic nie stoi na przeszkodzie, aby był ALTER TABLE DROP COLUMN
niej ograniczenie NOT NULL. to każdy inny znak. Służy do tego argument fs ;
(od field separator):
Tabele tekstowe Bardzo podobnie wygląda polecenie zmiany
Od wersji 1.7.0 HSQLDB obsługuje moż- sql> SET TABLE tabela_tekstowa SOURCE nazwy kolumny:
liwość zapisu danych w tabelach teksto-  plik_tabeli_tekstowej.csv;fs=| ;
ALTER TABLE ALTER
Listing 8. Ogólna składnia polecenia SELECT COLUMN RENAME TO SELECT [{LIMIT | TOP }[2]][ALL | DISTINCT] nazwa>
{ selectExpression | table.* | * } [, ...]
[INTO [CACHED | TEMP | TEXT][2] newTable] Istnieje również możliwość zmiany nazwy ca-
FROM lista_tabel łej tabeli:
[WHERE Wyrażenie]
[GROUP BY Wyrażenie [, ...]] ALTER TABLE RENAME TO
[HAVING Wyrażenie] ;
[{ UNION [ALL | DISTINCT] | {MINUS [DISTINCT] | EXCEPT [DISTINCT] } |
INTERSECT [DISTINCT] } selectStatement] Wprowadzanie danych
[ORDER BY orderExpression [, ...]] Mając gotową tabelę nadchodzi czas aby wsta-
[LIMIT [OFFSET ]]; wić do niej jakieś dane. W tym celu należy po-
służyć się poleceniem INSERT INTO TABLES
Listing 9. Kod nawiązania połączenia z serwerem HSQLDB w języku JAVA VALUES. Przykładowo, wprowadzenie danych
try{ do pierwszej tabeli z Listingu 7 będzie wyglą-
Class.forName("org.hsqldb.jdbcDriver").newInstance(); dało następująco:
}catch (Exception e){
e.printStackTrace(); sql> insert into klient values('Grzeg
return; orz','Madajczak','Kwiatowa 7/15 Warsza
} wa','65111501738');
Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://url_
bazy_danych", "użytkownik", "hasło"); Można także wprowadzić tekst tylko do po-
jedynczych kolumn, przy czym pozostałe ko-
18 luty 2009
Dla początkujących
Relacyjna baza danych HSQLDB
lumny, do których nie wprowadzamy da- Kolejnym krokiem jest wydanie polecenia rządkowana alfabetycznie, malejąco wg na-
nych muszą mieć dozwoloną wartość NULL. \bp: zwisk.
Ponownie za przykład posłuży tabela z Li- Najistotniejszą możliwością pobierania
stingu 7: sql> \bp danych z tabeli jest możliwość ich warunko-
wego wyszukiwania. Służy do tego polece-
sql> insert into klient(imie,nazwisko Na sam koniec ładujemy plik do tabeli, zastę- nie WHERE.
,pesel) values('Grzegorz','Madajcz pując plik w polu kolumny znakiem zapytania:
ak','65111501738'); sql> select * from klient where
sql> insert into filetable(nazwa_ nazwisko='Madajczak';
W powyższym poleceniu wprowadzono dane pliku,plik) values('przykładowe
do trzech kolumn z czterech, wyróżniając ich zdjęcie', ?); Powyższe polecenie zwróci listę danych klien-
nazwy w nawiasie po nazwie tabeli. tów o nazwisku Madajczak.
Bardzo ciekawą właściwością oferowa- Odczyt takiego pliku z tabeli wymaga ponow-
ną przez bazę danych HSQLDB jest moż- nie użycia trybu raw. Najpierw jednak wyszu- Skrypty SQL
liwość zapisu w bazie danych danych bi- kujemy plik poleceniem SELECT: Biblioteka hsqldb.jar daje nam również moż-
narnych, poprzez strumień wchodzący. Ce- liwość tworzenia skryptów powłoki, które wy-
cha ta realizowana jest przez kolumnę ty- sql> select file from filetable where korzystywać będą wewnętrzne polecenia na-
pu OTHER (lub OBJECT), która jak to wyni- id=0; pisane w języku SQL  zapytania do bazy da-
ka z Tabeli 2, przechowuje dane będące od- nych. Posługujemy się w tym celu znanym już
zwierciedleniem klasy java.lang.Object W wyniku tego polecenia plik zostanie zała- nam narzędziem SQLTool z przełącznikiem
z JAVA. Dla nie wtajemniczonych w arka- dowany do bufora. Teraz zostało zapisać go na --sql, po którym, następuje zapytanie w
na tego języka dodam, że w JAVA obiektem dysku, stosując polecenie \bd wraz ze ścież- SQL. Zapytanie to musi być zapisane pomię-
może być każdy plik, niezależnie czy jest to ką do pliku dzy dwoma apostrofami i obowiązkowo za-
plik dzwiękowy, obrazek, czy też inny do- kończone średnikiem. Dla przykładu posłuż-
wolny plik. sql> \bd /tmp/plik.jpg my się jeszcze raz tabelą z Listingu 7.
Aby zobrazować, jak się dokonuje tej nie-
zbyt skomplikowanej sztuki, posłużę się przy- Odczyt danych z tabeli $ java -jar hsqldb.jar --sql 'select
kładem. Najpierw należy utworzyć tabelę za- Dane z tabel odczytuje się za pomocą polece- * from klient;' urlid
wierającą kolumnę przechowującą dane ty- nia SELECT, którego ogólną składnię prezentu-
pu OBJECT: je Listing 8. Chcąc odczytać nazwiska wszyst- Powyższe polecenie zwróci nam całą zawar-
kich klientów zapisanych w tabeli z Listingu tość tabeli klient z bazy o identyfikatorze urlid.
sql> create table filetable(id int 7, wyrażenie przybierze następujący kształt: Aby to polecenie zadziałało, w pliku konfigu-
generated by default as identity(start racyjnym sqltool.rc musi być prawidłowo zde-
with 0), nazwa_pliku varchar, plik sql> select nazwisko from klient; finiowana baza danych. Można również posłu-
object); żyć się uwierzytelnianiem typu inlineRC. Wte-
Efektem działania powyższego polecenia bę- dy to powyższe polecenie będzie wyglądało
Następnie należy załadować do bufora plik dzie lista nazwisk. Można ją uporządkować al- nieco odmiennie:
który chcemy przechowywać w bazie danych. fabetycznie  służy do tego polecenie ORDER BY
Służy do tego polecenie wydane w trybie raw [ASC | DESC]: $ java -jar hsqldb.jar --sql 'select
mode  \bl, po którym podajemy ścieżkę do- * from klient;' --inlineRC URL=jdbc:
stępu do pliku. Polecenia te w przeciwieństwie sql> select imię,nazwisko from klient hsqldb:hsql://localhost/ścieżka/do/ba
do poleceń w języku SQL nie kończą się śred- order by nazwisko desc; zy,USER=użytkownik,PASSWORD=hasło
nikiem.
Efektem działania powyższego polecenia W powyższym poleceniu, dla jego prawidło-
sql> \bl /tmp/obrazk.jpg będzie lista imion i nazwisk klientów, upo- wego działania ważne jest, aby przełącznik sql
Tabela 3. Opcje zapisu pliku tabeli tekstowej
Opcja Opis Wartość domyślna
quoted true
Jeśli  false , cudzysłów traktowany jako normalny znak (true lub false)
all_quoted false
Jeśli  true , dodaje podwójne cudzysłowy do wszystkich pól
encoding UTF-8
Strona kodowa znaków
ignore_first true
Jeśli  true , ignorowana jest pierwsza linia (zawiera opisy nagłówków)
cache_scale 8
Przelicznik, do wylicznia liczby przechowywanych wierszy w cache (1 / 100 wierszy)
cache_size_scale 8
Przelicznik do obliczania średniego rozmiaru każdego wiersza w cache. 8 odpowiada 256 bitom na wiersz
fs ,
Separator pola danych
vs
Separator łańcucha znakowego (VARCHAR)
lvs
Separator długiego łańcucha znakowego (LONGVARCHAR)
www.lpmagazine.org 19
Dla początkujących
Relacyjna baza danych HSQLDB
znajdował się zaraz za poleceniem java -jar mej JVM. Takie uruchomienie daje największą nia podajemy następujący URL: jdbc:hsqldb:
hsqldb.jar, a przed przełącznikiem inlineRC. wydajność bazy danych, ponieważ omijane są res:/folder/baza, w którym to podajemy nazwę
potencjalne ograniczenia transmisji danych np. folderu, w którym pliki bazy są zlokalizowane
HSQLDB w JAVA przez sieć. Uruchomienie bazy danych w trybie oraz nazwę (urlid) bazy danych. W adresie tym
Jak wspomniałem na samym początku artyku- In-Process również odbywa się z wykorzysta- dodatek res mówi sterownikowi, że otwieramy
łu, HSQLDB jest bazą danych, której silnik zo- niem klasy Connection: bazę danych znajdującą się w pliku *.jar.
stał napisany w języku JAVA. Naturalne wyda-
je się więc zastosowanie tego silnika do wszyst- Connection c = DriverManager.getConne Podsumowanie
kich aplikacji napisanych w tym języku. Utwo- ction("jdbc:hsqldb:file:testdb", "sa", Przeprowadzone testy porównawcze dostępnych
rzenie połączenia z bazą HSQLDB odbywa się ""); baz danych (wolnych, jak i komercyjnych) wyka-
za pomocą implementacji klasy java.sql.Con- zują, że HSQLDB przoduje wśród nich szybko-
nection  klasy org.hsqldb.jdbc.jdbcCon- Dalej posługujemy się tak uzyskanym połącze- ścią dostępu do przechowywanych danych. Jed-
nection. Kod nawiązania połączenia z serwe- niem z bazą, jak tym z Listingu 9. nak od razu muszę dodać, że testy nie są miaro-
rem prezentuje Listing 9. Dalsze postępowanie, Jak widać z powyższych przykładów, baza dajne, gdyż domyślnie HSQLDB przechowu-
po uzyskaniu połączenia z bazą, jest takie samo, danych z silnikiem HSQLDB jest niemalże ideal- je tabele w całości w pamięci, co w porówna-
jak w przypadku każdej innej bazy obsługiwanej nym rozwiązaniem dla wszystkich, którzy progra- niu do innych baz, przechowujących dane zapi-
przez JDBC. Tak na przykład wysłanie zapytania mując w języku JAVA zmuszeni są do jakiegokol- sane na dysku, znacznie skraca czas dostępu do
do, bazy, z którą uzyskano połączenie reprezen- wiek zarządzania danymi. Olbrzymią zaletą bazy danych. Szybkość działania HSQLDB osiągnięta
towane przez Obiekt Connection conn (jak na HSQLDB jest możliwość przechowywania w niej dzięki przechowywaniu tabel z danymi w pamię-
Listingu 9) będzie wyglądało następująco: obiektów binarnych, takich jak np. pliki. Istnieje ci komputera równoważy poważną wadę aplika-
również możliwość korzystania z bazy danych cji napisanych w JAVA, jaką jest pewna ocięża-
java.sql.Statement st = HSQDB, której pliki zawarte są w paczce *.jar łość działania. Z drugiej zaś strony zmusza to pro-
conn.createStatement(); aplikacji. Taka baza danych będzie jednak działa- gramistę, czy też użytkownika bazy do pamięta-
java.sql.ResultSet rs = ła tylko w trybie do odczytu. W celu przygotowa- nia, że gromadzenie dużej ilości danych w pamię-
st.executeQuery("select * from tabela_ nia takiej bazy, należy się przede wszystkim upew- ci może doprowadzić do zmniejszenia szybkości
1"); nić, że żadna z tabel nie jest typu CACHED lub TEXT, działania całego systemu, ze względu na brakują-
gdyż wymagają one dostępu do ich plików w try- cą pamięć fizyczną RAM. Pewnym rozwianiem
Uzyskawszy obiekt ResultSet można pobie- bie odczytu i zapisu. Bazie takiej należy nadać tego problemu jest zastosowanie tabel typu CA-
rać na jego podstawie dane z zapytania: atrybut tylko do odczytu, a następnie zamknąć. CHED zamiast domyślnych typu MEMEORY. Jednak
w pierwszej sytuacji należy liczyć się ze zmniej-
while (rs.next()) { sql> SET READONLY TRUE; szeniem się prędkości działania bazy danych, po-
String s = rs.getString("b"); sql> SHUTDOWN; przez potencjalne wydłużenie czasu dostępu do
} gromadzonych danych.
Po wykonaniu powyższych czynności, w folde- Pomimo powyższych, nieznacznych wad,
Niemal na samym początku ego artykułu pisa- rze bazy danych należy odszukać jej pliki, a na- warto zainteresować się tym projektem. Baza
łem, że możliwe jest uruchomienie serwera w stępnie skopiować do folderu aplikacji pliki z HSQLDB stanowi bowiem doskonałe rozwiąza-
trybie In-Process, co oznacza, że działa on ja- rozszerzeniem *.properties oraz *.scripts. Chcąc nie dla małych projektów, gdzie nie ma wymogu
ko część aplikacji działającej w obrębie tej sa- połączyć się z taką bazą w parametrach połącze- 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.
O autorze
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
Rysunek 1. Program DatabaseManager
20 luty 2009


Wyszukiwarka

Podobne podstrony:
Relacyjna baza danych agga
Relacyjna baza danych Access 2007
2009 02 Ze skanu do bazy danych – digitalizacja rysunków, wykresów i map [Grafika]
2004 11 Porównanie serwerów relacyjnych baz danych Open Source [Bazy Danych]
[03] Bazy Danych Relacyjny Model Danych
BAZA DANYCH GEOLOGICZNYCH
BAZA DANYCH GMINNEJ EWIDENCJI ZABYTKÓW
Zestaw 1 Wprowadzenie do relacyjnych baz danych
Dokumenty XML w relacyjnych bazach danych czyli wojna światów I
Baza danych w programie Access

więcej podobnych podstron