NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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

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 - Derby DB
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 - Derby DB

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ínkami

Staženo 430x (5.9 kB)

 

Předchozí článek
Derby DB - Připojení přes DataSource
Všechny články v sekci
Derby DB
Přeskočit článek
(nedoporučujeme)
Kvíz - DataSource a možnosti připojení Derby DB v Javě
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
2 hlasů
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity