Lekce 6 - Derby DB - Připojení k databazi IN-MEMORY
V předchozí lekci, Derby DB - Připojení přes DataSource, jsme si předvedli použití DataSource k připojení Derby databáze.
V dnešní lekci si ukážeme nahrání celé relační databáze Derby DB do paměti. Specifikace není úplně přesná, ale zřejmě se jedná o haldu(heap) v JVM, která je umístěná v RAM. V běžném režimu se databáze nachází v systému souborů. Použití in-memory je výhodné při vývoji a testování. Práce s databází by měla být rychlejší neboť nejsme omezování I/O rychlostí disku. Při používání IN-MEMORY je vhodné upravit nastavení Java heap memory (paměť haldy JVM) a Derby page cache (stránkovací mezipaměti). Informace o úpravě stránkovací paměti se nachází v Tunning DB.pdf a nastavení velikosti haldy se určuje při spuštění programu.
Pokud chceme tedy vytvořit in-memory databázi (zajistit databázi v paměti
JVM), uděláme to následujícím způsobem. Parametr připojení s
create=true
zajistí vytvoření nové databáze a
do ní poté umístíme tabulky a data. To je stejné jako v případě
normální databáze, u ní se používá
jdbc:derby://localhost:1527/databaze4;
a v
případě in-memory se přidá pouze slovíčko
memory:
aby spojení vypadalo takto
jdbc:derby://localhost:1527/memory:databaze4;
.
try { connect = DriverManager.getConnection("jdbc:derby://localhost:1527/memory:databaze4;" + "create=true;user=uzivatel4;password=heslo4"); System.out.println("Podarilo se nahrat do pameti"); } catch (Exception e) { System.err.println("Nepodarilo se nahrat do pameti"); }
V případě vestavěné(embedded) databáze se spojení řeší takto:
try { connect = DriverManager.getConnection("jdbc:derby:memory:databaze4;create=true;user=uzivatel4;password=heslo4"); System.out.println("Podarilo se nahrat do pameti"); } catch (Exception e) { System.err.println("Nepodarilo se nahrat do pameti"); }
Pokud chceme databázi odstranit z paměti, řešíme to tímto postupem:
try { connect = DriverManager.getConnection("jdbc:derby://localhost:1527/memory:databaze4;drop=true;user=uzivatel4;password=heslo4"); System.err.println("Nepodarilo se odstranit z pameti"); } catch (Exception e) { System.out.println("Podarilo se odstranit z pameti"); }
Problém postupu je, že vyhození databáze z paměti způsobí ERROR 08006, což aktivuje v Javě výjimkový blok catch. Podle mě je to jednoznačná chyba v logice řešení. Faktem ovšem zůstává, že databáze skutečně vypadne z paměti. Pravděpodobně je to způsobeno tím, že IM-MEMORY moc často nepoužívají a tak nevzniká tlak na úpravu.
Pokud chceme databázi odstranit z paměti v případě vestavěné (embedded) :
try { connect = DriverManager.getConnection("jdbc:derby:memory:databaze4;drop=true;user=uzivatel4;password=heslo4"); System.err.println("Nepodarilo se odstranit z pameti"); } catch (Exception e) { System.out.println("Podarilo se odstranit z pameti"); }
K odstranění z paměti samozřejmě dojde pokud JVM spadne, JVM je ukončeno (shut down) nebo je Derby Server ukončen či vypnut. Což je docela slabina a proto se in-memory zas tolik nepoužívá.
Nahrání souborové databáze do IN-MEMORY
Pracovat s IN-Memory databází můžete dvěma způsoby. První (delší) je vytvořit ji, manuálně různými způsoby vytvořit tabulku a pak ji různými způsoby naplnit daty. Druhou a rychlejší možností je připojit již funkční databázi i s daty obsaženou v adresáři. My si vyzkoušíme variantu již s reálnou databází.
Před spuštěním IJ commandu je nutné spustit i DerbyDB
server. Jako první spustíme příkaz ij
přes příkazový
řádek cmd a spustíme sql skript obsahující specifikace tabulky a samotná
data. Co vlastně děláme? Nejdříve se spojíme s derbyDB serverem a
vytvoříme si databazi04 s parametry, poté spustíme sql skript, dále
provedeme kontrolní výpis dat a pak se od databáze odpojíme a ukončíme
ij
.
ij> connect 'jdbc:derby://localhost:1527/databaze04;create=true;user=Uzivatel4;password=Heslo4'; ij> run 'D:\Dokumenty\Java\ProjektDERBY06\datab Emploee.sql'; ij> SELECT * FROM employee ORDER BY id; ij> disconnect; ij> exit;
SQL skript se jmenuje datab Emploee.sql a obsahuje :
CREATE TABLE employee( id int not null, firstname varchar(64), lastname varchar(64), email varchar(64)); INSERT INTO employee VALUES(0, 'Jan', 'Novak', '[email protected]'); INSERT INTO employee VALUES(1, 'Ales', 'Boruvka', '[email protected]'); INSERT INTO employee VALUES(2, 'Petr', 'Mlady', '[email protected]'); INSERT INTO employee VALUES(3, 'Peter', 'Palfy', '[email protected]');
Výsledkem této činnosti bude testovací databaze04 a v ní tabulka employee, která obsahuje data.
Vytvoření projektu v JavaSE
Vytvoříme si testovací příklad v Java SE projektu v IDE. Přidáme opět externí knihovny do našeho projektu do CLASSPATH.
- derbyclient.jar
- derbytools.jar
- derbyoptionaltools.jar
My si nyní vytvoříme program, který tuto testovací databázi nahraje do
in-memory, provedeme výpis dat a pak ji z in-memory odstraníme. Jak toho
docílíme? Přidáme pouze jeden parametr při vytváření spojení
"restoreFrom=c:\\Program Files\\JavaJDK\\db\\bin\\databaze04\\"
,
kde se budeme odkazovat na fyzické umístění databáze v adresářové
struktuře. Toto umístění (cesta k databázi) se u vás může lišit.
package inmemory; import java.sql.*; public class ProjektINMEMORY { private static Connection connect = null; private static Statement statement = null; private static ResultSet odpoved = null; static { try { Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { System.out.println("Problem s nactenim driveru - nutne pridat do CLASSPATH"); } } private static void pripojeniDatabazeINMEMORY() { try { connect = DriverManager.getConnection("jdbc:derby://localhost:1527/memory:databaze04;user=Uzivatel4;password=Heslo4;" + "restoreFrom=c:\\Program Files\\JavaJDK\\db\\bin\\databaze04\\"); System.out.println("Podarilo se pripojit k databazi04"); } catch (Exception e) { System.err.println("Nepodarilo se pripojit k databazi04"); if (connect == null) { System.exit(1); } } } private static void vypisemeData() { try { statement = connect.createStatement(); odpoved = statement.executeQuery("SELECT * FROM Employee ORDER BY id"); System.out.print("Podarilo se ziskat data :"); while (odpoved.next()) { System.out.print("\nJmeno :" + odpoved.getString(2)); System.out.print("\tPrijmeni :" + odpoved.getString(3)); System.out.print("\tMail:" + odpoved.getString(4)); } } catch (SQLException e) { System.out.println("Nepovedlo se ziskat data :"); e.printStackTrace(); } } private static void odpojimeDatabazi() { // vymazeme z pameti try { connect = DriverManager.getConnection("jdbc:derby://localhost:1527/memory:databaze04;drop=true"); System.err.println("\nNepodarilo se vymazat databazi04 z pameti"); } catch (Exception e) { System.out.println("\nPodarilo se vymazat databazi04 z pameti"); } // zrusime objekty try { if (statement != null) { statement.close(); } if (connect != null) { connect.close(); } System.out.println("\nPodarilo se odpojit od databaze"); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { System.out.println("Start Programu"); pripojeniDatabazeINMEMORY(); Thread.sleep(2000); vypisemeData(); Thread.sleep(2000); odpojimeDatabazi(); System.out.println("Konec Programu"); } }
V konzoli je krásně vidět výstup spuštěného programu. Jak vidíte, skutečně se v části kódu, kde rušíme databázi z in-memory, zavolá výjimka a vyvolá se blok v catch. Pokud se podíváte podrobně do výpisového okna DerbyDb, lze si přečíst, že databaze04 byla skutečně dropped (vymazána). Takto se tedy používá in-memory databáze. Samozřejmě lze mít v in-memory i více databází, mazat, nahrávat apod..
V následujícím kvízu, Kvíz - DataSource a možnosti připojení Derby DB v Javě, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 430x (5.9 kB)