2012-11-01 13 views
10

Obecnie prowadzę petproject na Maven pomocą wbudowanego molo i bazy danych H2:Plik źródłowej bazy danych Spring H2?

<jdbc:embedded-database id="dataSource" type="H2"> 
    <jdbc:script location="/WEB-INF/database.sql"/> 
</jdbc:embedded-database> 

To ustawienie resetuje mój DB za każdym razem uruchomić serwer. Chcę zapisać DB jako plik na dysku, aby nie tracić danych przy każdym uruchomieniu serwera. Jak to zrobić?

+1

Czy możesz podać więcej informacji o tym, co chciałbyś osiągnąć? Czy próbujesz przejść do innej bazy danych? –

+0

Jaki jest adres URL bazy danych? –

+0

Chciałbym, aby mój H2 DB był przechowywany na dysku, a nie w pamięci (jak mam teraz). – Pomario

Odpowiedz

7

Można to kontrolować za pomocą ciągu połączenia.

jdbc:h2:~/test; # saves to the file ~/test 
jdbc:h2:mem:db1 # in memory 

Więcej informacji here.

EDIT:

Wydaje się ciąg połączenia jest hard-coded wiosną H2 konfiguracji, więc zakładam, że oznacza, że ​​trzeba napisać Ci własną implementację poprzez rozszerzenie EmbeddedDatabaseConfigurer, zakładając, że nie ma innego sposobu na zmianę połączenia ciąg po ustawieniu w H2EmbeddedDatabaseConfigurer.

+0

Po rozwiązaniu problemu nie mogę znaleźć pliku "mydb". Ja czegoś brakuje? \t \t \t \t \t Pomario

+0

Przepraszam, ominęło to. Zobacz edycję. – ebaxt

2

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)

Powiązane problemy