Zielony Smok - logo witryny

Apache Derby: baza danych w pamięci

Baza danych w pamięci

Baza danych jest umieszczona jedynie w pamięci w danej JVM. Nie są tworzone żadne pliki. Nie jest włączona do systemu Derby. Ze względu na brak długotrwałych operacji ‘odczyt-zapis’ baza w pamięci jest bardzo szybka. Po wyłączeniu komputera lub zamknięciu bazy – baza przestaje istnieć wraz z zawartymi w niej danymi.

W dwóch różnych JVM na jednym komputerze można uruchomić dwie różne bazy w pamięci o tej samej nazwie, ale nie jest to ta sama baza.

Najczęściej używana jest w celach testowych.

Tworzenie bazy danych

Jeśli chcesz utworzyć bazę ‘moja_baza’ w pamięci:

jdbc:derby:memory:moja_baza;create=true

Możesz też użyć poniższej metody z klasy DerbyUtil:

public static Connection connectMemoryDB(String dbName,
  String properties) {
Connection conn = DriverManager.getConnection(
"jdbc:derby:memory:" + dbName + ";" + properties);
return conn;
}

W przypadku korzystania ze sterownika ClientDrver polecenie to powinno wyglądać:

jdbc:derby://localhost:1527/memory:moja_baza;create=true

Ścieżki dostępu do bazy w przypadku bazy w pamięci nie mają żadnego znaczenia, gdyż baza nie jest umieszczona w systemie plików. Cokolwiek wpiszesz – baza i tak jest wyłącznie w pamięci.

W przypadku bazy w pamięci może być konieczne dostosowanie wielkości sterty i zmiana wielkości strony.

Usuwanie bazy

Bazę danych można zamknąć używając atrybutu shudown=true

Do usunięcia bazy z pamięci używa się atrybutu: drop=true. Użycie drop wykonuje również operację shutdown

Możesz też użyć metody dropInMemoryDb z klasy DerbyUtil omówionej w rozdziale poświęconym usuwaniu baz danych

Baza jest automatycznie usuwana z pamięci w przypadku:

  • zamknięcia JVM (normalnego lub awaryjnego)
  • użycia polecenia exit w narzędziu ij

Zapamiętanie bazy

W przypadku chęci zachowania bazy danych, która jest w pamięci można uruchomić procedurę systemową: SYSCS_UTIL.SYSCS_BACKUP_DATABASE

Aby dowiedzieć się jak użyć tej procedury dowiesz się w rozdziale o JDBC.

Utrwalona baza może być uruchamiana jako baza w pamięci lub jako ‘normalna’ baza w systemie Derby.

Ze względu na tymczasowość danych znacznie wygodniejsze jest operowanie na bazie danych z poziomu narzędzia ij.

Przykład

Przykład w klasie R092_memory.java.

Klasa R092_memory.java
package aderby.specyf;

import aderby.DerbyUtil;

import java.sql.*;

public class R092_memory {
    private static final String baza = "moja_baza";
    private static final String properties = "create=true";
    private static final String createTable = "CREATE TABLE firsttable "
            + "(id INT PRIMARY KEY,    name VARCHAR (12))";
    private static final String insertData = "INSERT INTO firsttable "
            + "VALUES(1, 'Mirka'),(2, 'Ula'),(3, 'Jacek')";
    private static final String selectData1 = "SELECT * FROM firsttable";
    private static final String selectData2 = "SELECT * FROM firsttable "
            + "WHERE id=2";

    public static void main(String[] args) {
        DerbyUtil.startDerbyEngine(DerbyUtil.embdriver);
        Connection conn = DerbyUtil.connectMemoryDB(baza, properties);
        Statement stat1 = null;
        Statement stat2 = null;
        ResultSet rs1 = null;
        ResultSet rs2 = null;

        try {
            stat1 = conn.createStatement();
            stat1.execute(createTable);
            stat1.execute(insertData);
            rs1 = stat1.executeQuery(selectData1);
            while (rs1.next()) {
                System.out.println(rs1.getInt(1) + " | " + rs1.getString(2));
            }
            stat2 = conn.createStatement();
            rs2 = stat2.executeQuery(selectData2);
            while (rs2.next()) {
                System.out.println(rs2.getInt(1) + " | " + rs2.getString(2));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DerbyUtil.close(rs1);
        DerbyUtil.close(rs2);
        DerbyUtil.close(stat1);
        DerbyUtil.close(stat2);
        DerbyUtil.close(conn);
        //DerbyUtil.dropInMemoryDB("moja_baza");
        DerbyUtil.shutdownDerbyEngine();
    }
}

Wynik

1 | Mirka
2 | Ula
3 | Jacek
2 | Ula

Pliki do ściągnięcia

Aktualny (tworzony narastająco) plik module-info.java

Aktualny (tworzony narastająco) plik DerbyUtil.java

Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java może być potrzebne skreślenie niepotrzebnych wpisów.