6. diel - Derby DB - Pripojenie k databaze IN-MEMORY
V dnešnej lekcii si ukážeme nahranie celej relačnej databázy Derby DB do pamäte. Špecifikácia nie je úplne presná, ale zrejme sa jedná o haldu (heap) v JVM, ktorá je umiestnená v RAM. V bežnom režime sa databáza nachádza v systéme súborov. Použitie in-memory je výhodné pri vývoji a testovaní. Práca s databázou by mala byť rýchlejšia pretože nie sme obmedzovaní I / O rýchlosťou disku. Pri používaní IN-MEMORY je vhodné upraviť nastavenia Java heap memory (pamäť haldy JVM) a Derby page cache (stránkovací medzipamäte). Informácie o úprave stránkovací pamäti sa nachádza v Tunning DB.pdf a nastavenie veľkosti haldy sa určuje pri spustení programu.
Ak chceme teda vytvoriť in-memory databázu (zaistiť databáze v pamäti
JVM), urobíme to nasledujúcim spôsobom. Parameter pripojenie s
create=true
zaistí vytvorenie novej databázy a
do nej potom umiestnime tabuľky a dáta. To je rovnaké ako v prípade
normálnej databázy, u nej sa používa
jdbc:derby://localhost:1527/databaze4;
a v
prípade in-memory sa pridá len slovíčko
memory:
aby spojenie vyzeralo 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 prípade vstavané (embedded) databázy sa spojenie rieši 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"); }
Ak chceme databázu odstrániť z pamäte, riešime to týmto postupom:
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 vyhodenie databázy z pamäte spôsobí ERROR 08006, čo aktivuje v Jave výnimkový blok catch. Podľa mňa je to jednoznačná chyba v logike riešení. Faktom však zostáva, že databázy skutočne vypadne z pamäte. Pravdepodobne je to spôsobené tým, že IM-MEMORY moc často nepoužívajú a tak nevzniká tlak na úpravu.
Ak chceme databázu odstrániť z pamäte v prípade vstavané (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"); }
Na odstránenie z pamäte samozrejme dôjde ak JVM spadne, JVM je ukončené (shut down) alebo je Derby Server ukončený alebo vypnutý. Čo je celkom slabina a preto sa in-memory zas toľko nepoužíva.
Nahranie súborové databázy do IN-MEMORY
Pracovať s IN-Memory databáz môžete dvoma spôsobmi. Prvý (dlhšia) je vytvoriť ju, manuálne rôznymi spôsobmi vytvoriť tabuľku a potom ju rôznymi spôsobmi naplniť dátami. Druhou a rýchlejší možnosťou je pripojiť už funkčná databáze is dátami obsiahnutú v adresári. My si vyskúšame variantu už s reálnou databázou.
Pred spustením IJ Command je nutné spustiť aj DerbyDB
server. Ako prvý spustíme príkaz ij
cez príkazový riadok cmd a
spustíme sql skript obsahujúce špecifikácie tabuľky a samotná dáta. Čo
vlastne robíme? Najskôr sa spojíme s derbyDB serverom a vytvoríme si
databazi04 s parametrami, potom spustíme sql skript, ďalej vykonáme
kontrolné výpis dát a potom sa od databázy 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 sa volá 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ýsledkom tejto činnosti bude testovací databaze04 a v nej tabuľka employee, ktorá obsahuje dáta.
Vytvorenie projektu v Javas
Vytvoríme si testovací príklad v Java SE projektu v IDE. Pridáme opäť externé knižnice do nášho projektu do CLASSPATH.
- derbyclient.jar
- derbytools.jar
- derbyoptionaltools.jar
My si teraz vytvoríme program, ktorý túto testovaciu databázu nahrá do
in-memory, vykonáme výpis dát a potom ju z in-memory odstránime. Ako to
docielime? Pridáme iba jeden parameter pri vytváraní spojenia
"restoreFrom=c:\\Program Files\\JavaJDK\\db\\bin\\databaze04\\"
,
kde sa budeme odkazovať na fyzické umiestnenie databázy v adresárovej
štruktúre. Toto umiestnenie (cesta k databáze) sa u vás môže líšiť.
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 konzole je krásne vidieť výstup spusteného programu. Ako vidíte, skutočne sa v časti kódu, kde rušíme databázu z in-memory, zavolá výnimka a vyvolá sa blok v catch. Ak sa pozriete podrobne do výpisového okna DerbyDb, možno si prečítať, že databaze04 bola skutočne dropped (vymazaná). Takto sa teda používa in-memory databázy. Samozrejme možno mať v in-memory i viac databáz, mazať, nahrávať a pod ..
Nabudúce si rozoberieme prihlasovanie a prístup k dátum k databáze cez LAN.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 434x (5.9 kB)