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.