IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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 tabuľky v DerbyDB databáze v Jave - DerbyDb

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

Program pre in-memory databázu v DerbyDb - 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 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 ..

Výsledok programu pre in-memory databázu v Java a Derby DB - DerbyDb

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 podmienkami

Stiahnuté 434x (5.9 kB)

 

Predchádzajúci článok
Derby DB - pripojenie cez DataSource
Všetky články v sekcii
DerbyDb
Preskočiť článok
(neodporúčame)
Derby DB - Pripojenie k databáze LAN / WAN
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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