Stare pytanie, ale spędziłem dużo czasu zastanawiając się, jak zapisać osadzoną bazę danych H2 w pliku i chcę podzielić się tym, czego się nauczyłem.
Jako @ebaxt powiedział, że można skonfigurować lokalizację wbudowanej bazy danych w ciągu połączenia. Jeśli chcesz zapisać go w zastosowaniu systemu plików ~/
składnię:
jdbc:h2:~/example/embeddedDb
Jeśli chcesz zapisać go wewnątrz folderu projektu trzeba użyć ./
składnię
jdbc:h2:./example/embeddedDb
stworzy embeddedDb.mv.db
plik w folderze example
w folderze domowym lub w folderze głównym projektu. Ale to spowoduje usunięcie bazy danych przy każdym uruchomieniu aplikacji. Aby tego uniknąć użyłem właściwość INIT
powiedzieć H2 do tworzenia schematu (Kolejka w moim przypadku) tylko wtedy, gdy nie istnieje:
INIT=create schema if not exists Queue;
Następnie w skrypcie DDL trzeba użyć utworzyć tabelę, jeśli nie istnieje oświadczenie, stworzyć wszystkie tabele:
// create-db.sql
CREATE TABLE IF NOT EXISTS Queue (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
...
);
i powiedzieć H2, aby uruchomić skrypt za każdym razem robi się gra:
// if you want to store the script in the file system
runscript from '~/example/create-db.sql'
// if you want to store the script in the project folder
runscript from './example/create-db.sql'
Podsumowując to, co trzeba zrobić, aby CRE jedli bazy danych (EmbeddedDb) w Java adnotacji sposób:
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Bean
DataSource datasource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUsername("embedded");
dataSource.setPassword("embedded");
dataSource.setUrl("jdbc:h2:~/example/EmbeddedDb;INIT=create schema if not exists Queue\\; runscript from '~/example/create-db.sql'");
return dataSource;
}
lub za pomocą XML:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
destroy-method="close">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/example/EmbeddedDb;INIT=create schema if not exists Queue\; runscript from '~/example/create-db.sql'" />
<property name="username" value="embedded" />
<property name="password" value="embedded" />
</bean>
Dzięki tej metodzie baza danych zostanie utworzona tylko wtedy, gdy po raz pierwszy działa aplikacja lub jeśli baza danych plik nie istnieje. W przeciwnym razie zostanie załadowane tylko połączenie.
Można także monitorować stan bazy z ładnym interfejsem przy użyciu biblioteki hsqldb, dodając następujący Fasola:
import org.h2.tools.Server;
import org.hsqldb.util.DatabaseManagerSwing;
@Bean(initMethod = "start", destroyMethod = "stop")
public Server startDBManager() throws SQLException {
DatabaseManagerSwing.main(new String[] { "--url", "jdbc:h2:~/example/EmbeddedDb", "--user", "embedded", "--password", "embedded" });
return Server.createWebServer();
}
Referencje:
http://www.mkyong.com/spring/spring-embedded-database-examples/
http://www.h2database.com/html/features.html#embedded_databases (Execute SQL w sekcji Połącz)
Czy możesz podać więcej informacji o tym, co chciałbyś osiągnąć? Czy próbujesz przejść do innej bazy danych? –
Jaki jest adres URL bazy danych? –
Chciałbym, aby mój H2 DB był przechowywany na dysku, a nie w pamięci (jak mam teraz). – Pomario