Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

HyperSQL DataBase (HSQLDB)

V predchádzajúcom kvíze, Kvíz - Databáza v Jave, sme si overili nadobudnuté skúsenosti z kurzu.

HyperSQL DataBase (HSQLDB) je open source SQL databáza napísaná v Jave. V tomto článku sa na HSQLDB pozrieme bližšie a ukážeme si, ako s databázou pracovať pomocou rozhrania JDBC (Java Database Connectivity).

Stiahnutie

HSQLDB je k dispozícii voľne na stiahnutie z adresy http://hsqldb.org. V balíku ZIP v adresári lib nájdete súbor hsqldb.jar, ktorý obsahuje:

  • databázový engine HSQLDB
  • ovládač JDBC
  • HSQL Database Manager - nástroj s grafickým používateľským rozhraním pre správu databáz

Spustenie

HSQLDB podporuje rôzne režimy spustenia a uloženia dát. Režim sa zvolí na základe URL pre ovládač JDBC pri vytváraní spojenia.

Databázu je možné spustiť:

  1. priamo v aplikácii, ktorá k databáze pristupuje (in-process)
  2. ako samostatnú aplikáciu (server mode)

Databáza podporuje rôzne spôsoby ukladania dát:

  1. operačná pamäť
  2. súbor
  3. zdroje na class path (resource)

1a) Spustenie in-process s uložením dát v operačnej pamäti

Ak zadáme URL vo formáte jdbc:hsqldb:mem:DATABASE_NAME, v operačnej pamäti sa pri prvom volaní metódy DriverManager.getConnection vytvorí nová databáza s názvom DATABASE_NAME.

V rámci jedného procesu možno vytvoriť viacero databáz s rôznymi názvami. K databáze je možné pristupovať z viacerých vlákien súčasne, ale nemôžu k nej pristupovať ostatné procesy. Databáza zanikne pri jej zastavení.

Príklad 1: Vytvorenie databázy v operačnej pamäti. Databáza sa vytvorí počas vytvárania databázového spojenia.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:mydatabase");
Statement stmt = connection.createStatement();
stmt.executeUpdate("CREATE TABLE MyTable (id BIGINT, text VARCHAR(100))");

1b) Spustenie in-process s uložením dát v súbore

Ak zadáme URL vo formáte jdbc:hsqldb:file:FILE_PATH, databáza sa načíta z požadovaného súboru. Ak súbor neexistuje, je automaticky vytvorený vrátane prípadných adresárov.

K databáze možno opäť pristupovať z viacerých vlákien súčasne, nie ale z rôznych procesov súčasne. Proces, ktorý s databázou pracuje, dátové súbory zamkne, takže sú pre ostatné procesy neprístupné. Po ukončení procesu zostane databáza zachovaná. Ak nie sú dátové súbory zamknuté, je možné ich otvoriť pomocou nástroja HSQL Database Manager.

Príklad 2: Vytvorenie databázy na súborovom systéme. Dáta sa uložia do súborov do adresára databazy. Opakované spustenie ukážkového programu zlyhá s chybou, pretože tabuľka už bude existovať.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:database/mydatabase");
Statement stmt = connection.createStatement();
stmt.executeUpdate("CREATE TABLE MyTable (id BIGINT, text VARCHAR(100))");
...

1c) Spustenie in-process s uložením dát v resource

Ak zadáme URL vo formáte jdbc:hsqldb:res:PATH_TO_SOURCE, databáza sa načíta zo zadaného zdroja na class path. Formát súborov je zhodný ako v prípade uloženia dát v súbore. Po načítaní sa databáza správa obdobne ako v prípade uloženia dát v operačnej pamäti. Do databázy možno síce zapisovať, ale zmeny sa nikam neukladajú.

2) Server mode

HSQLDB je možné spustiť samostatne príkazom:

java -cp hsqldb.jar org.hsqldb.server.Server

V tomto prípade sa vytvorí nová databáza s prázdnym názvom a databázovým súborom test. Databáza počúva na TCP porte 9001.

Pre prístup k databáze je potrebné zadať URL vo formáte jdbc:hsqldb:hsql://HOSTNAME/DATABASE_NAME.

Príklad 3: Vytvorenie pripojenia do samostatne spustenej databázy s prázdnym názvom.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost");

Pri spustení je možné zadať viacero rôznych databáz s rôznymi názvami:

java -cp hsqldb.jar org.hsqldb.server.Server --database.0 file:mydatabase --dbname.0 mydatabase --database.1 mem: --dbname.1 memorydatabase

Príklad 4: Vytvorenie pripojenia do samostatne spustenej databázy mydatabase.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/mydatabase");

Dobrým zvykom je pri spustení špecifikovať veľkosť pamäte pre JVM:

java -Xmx64m -cp hsqldb.jar org.hsqldb.server.Server

Popis ďalších parametrov spustení nájdete v dokumentácii na adrese http://hsqldb.org/doc/2.0/guide.

Zastavenie databázy

V prípade spustenia databázy in-process dôjde k jej zastaveniu automaticky pri ukončení procesu.

V prípade spustenia databázy v server móde z príkazového riadku zastavíme databázu klávesmi CTRL + C.

Databázu možno tiež zastaviť príkazom SHUTDOWN.

HSQL Database Manager

HSQL Database Manager je možné spustiť z príkazového riadka príkazom:

java -jar hsqldb.jar

Pomocou tohto nástroja sa dá pripojiť do ľubovoľnej databázy, pre ktorú je na class path k dispozícii ovládač JDBC.

Príklad spustenia s ovládačom JDBC pre MySQL:

java -cp mysql-connector-java-5.1.28-bin.jar;hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

Tabuľky

Pri vytváraní tabuliek je potrebné dať pozor na typ. HSQLDB definuje typy MEMORY a CACHED. Východiskovým typom je MEMORY. Tabuľky typu MEMORY sú veľmi rýchle, pretože všetky dáta sú skopírované do operačnej pamäte. Ak ale pamäť dôjde, databáza havaruje s chybou OutOfMemoryError.

Príklad 5: Vytvorenie tabuľky typu MEMORY a jej plnenie dátami až do pádu databázy.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/mydatabase");
Statement stmt = connection.createStatement();
stmt.executeUpdate("CREATE TABLE MyTable (id BIGINT, text VARCHAR(100))");
stmt.close();
PreparedStatement pstmt = connection.prepareStatement("INSERT INTO MyTable(id, text) VALUES (?, ?)");
for (int id = 0; id < Integer.MAX_VALUE; id++) {
  System.out.println(id);
  pstmt.setLong(1, id);
  pstmt.setString(2, "some long text " + id);
  pstmt.executeUpdate();
}
...

Tabuľka typu CACHED nie je limitovaná veľkosťou pridelenej operačnej pamäte, pretože dáta ukladá do súboru a v operačnej pamäti je len časť dát. Tabuľku typu CACHED možno vytvoriť príkazom CREATE CACHED TABLE. Predvolený typ tabuliek pre celú databázu je možné zmeniť príkazom SET DATABASE DEFAULT TABLE TYPE CACHED.

Tabuľka typu CACHED nemá zmysel v prípade uloženia dát v operačnej pamäti. V takom prípade sa príznak CACHED ignoruje.

Dátové typy

Z dátových typov podporuje HSQLDB:

  • číselné dátové typy TINYINT, SMALLINT, INTEGER, BIGINT, NUMERIC a DECIMAL
  • logický dátový typ BOOLEAN
  • znakové reťazcové dátové typy CHAR, VARCHAR a CLOB
  • binárne reťazcové typy BINARY, VARBINARY a BLOB
  • bitové reťazcové typy BIT a BIT VARYING
  • dátové typy pre prácu s časom DATE, TIME, TIMESTAMP a TIMESTAMP WITH TIME ZONE
  • a ďalšie

Automatická inkrementácia stĺpca

HSQLDB podporuje automatickú inkrementáciu stĺpca. Stĺpec sa vytvorí pomocou klauzuly GENERATED BY DEFAULT AS IDENTITY.

Príklad 6: SQL príkaz na vytvorenie tabuľky s primárnym kľúčom s automatickou inkrementáciou.

CREATE TABLE MyTable (
  id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  data VARCHAR(2000))

Príklad 7: Vloženie riadku do tabuľky s primárnym kľúčom s automatickou inkrementáciou.

Ak do stĺpca pri INSERTe zadáme NULL alebo hodnotu vynecháme, HSQLDB hodnotu primárneho kľúča vygeneruje automaticky.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:mydatabase");
Statement stmt = connection.createStatement();
stmt.executeUpdate("CREATE TABLE MyTable (id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, data VARCHAR(2000))");
stmt.executeUpdate("INSERT INTO MyTable(id, data) VALUES (NULL, 'world')");
stmt.executeUpdate("INSERT INTO MyTable(data) VALUES ('hello')");
ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable");
while (rs.next()) {
  System.out.println(rs.getObject(1) + " | " + rs.getObject(2));
}

Transakcie

HSQLDB podporuje transakcie. Aby transakcie v JDBC správne fungovali, treba pomocou metódy Connection.setAutoCommit(boolean) zakázať auto commit - automatické potvrdenie transakcie po každej operácii.

Príklad 8: Vloženie riadkov do tabuľky so zapnutými transakciami.

Najprv nastavíme auto commit na false. Metóda rollback zruší transakciu, takže nedôjde k vloženiu riadkov do tabuľku. Potvrdením transakcie metódou commit dôjde k vloženiu riadkov do databázy.

Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:mydatabase");
connection.setAutoCommit(false);
Statement stmt = connection.createStatement();
stmt.executeUpdate("CREATE TABLE MyTable (id INTEGER PRIMARY KEY, data VARCHAR(2000))");
stmt.executeUpdate("INSERT INTO MyTable(id, data) VALUES (1, 'world')");
stmt.executeUpdate("INSERT INTO MyTable(id, data) VALUES (2, 'hello')");
connection.rollback();
stmt.executeUpdate("INSERT INTO MyTable(id, data) VALUES (1, 'hello')");
stmt.executeUpdate("INSERT INTO MyTable(id, data) VALUES (2, 'world')");
connection.commit();
ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable");
while (rs.next()) {
  System.out.println(rs.getObject(1) + " | " + rs.getObject(2));
}

Záver

HSQLDB patrí niekoľko rokov medzi obľúbené SQL databázy vo svete Javy. Vďaka svojej jednoduchosti a nízkym nárokom ju ocenia nielen vývojári. Čitateľom ITnetwork môže táto databáza poslúžiť ako výborná hračka pri štúdiu JDBC.


 

Ako sa ti páči článok?
Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
Ako sa ti kurz páči?
Tvoje hodnotenie kurzuZnakov 0 z 50-500
Predchádzajúci článok
Kvíz - Databáza v Jave
Všetky články v sekcii
Databázy v Jave - JDBC
Článok pre vás napísal Silvinios
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity