Lekce 6 - Derby DB - Připojení k databazi IN-MEMORY

Java Databáze Apache Derby Derby DB - Připojení k databazi IN-MEMORY

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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í tabulky v DerbyDB databázi v Javě

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
  • derbyoptional­tools.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.

Program pro in-memory databázi v DerbyDb
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ýsledek programu pro in-memory databázi v Java a Derby DB

Příště si rozebereme přihlašování a přístup k datum k databázi přes LAN.


 

Stáhnout

Staženo 46x (5.9 kB)

 

 

Článek pro vás napsal Robert Michalovič
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovi%C4%8D-8a9b9498
Miniatura
Všechny články v sekci
DerbyDb
Aktivity (3)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!