2012-11-01 16 views
10

Attualmente io faccio girare il mio petproject su Maven utilizzando un pontile integrato e un database H2:File di database incorporato Spring H2?

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

Questa impostazione ripristina il mio DB ogni volta che faccio funzionare il server. Voglio salvare il DB come file nel disco in modo da non perdere i miei dati all'avvio di ogni server. Come posso realizzare questo?

+1

Potete fornire ulteriori informazioni su ciò che vorreste realizzare? Stai cercando di passare ad un altro database? –

+0

Qual è l'URL del tuo database? –

+0

Mi piacerebbe avere il mio H2 DB memorizzato su disco invece che in memoria (come ho fatto ora). – Pomario

risposta

7

È possibile controllare questo tramite la stringa di connessione.

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

Ulteriori informazioni here.

EDIT:

Sembra come la stringa di connessione è hard-coded in primavera configurazione H2, quindi supporre che significa che si deve scrivere la propria implementazione estendendo la EmbeddedDatabaseConfigurer, supponendo che non v'è altro modo di cambiare il collegamento stringa dopo che è impostata su H2EmbeddedDatabaseConfigurer.

+0

Seguendo la tua soluzione, non riesco a trovare il file "mydb". Mi sto perdendo qualcosa? \t \t \t \t \t Pomario

+0

Scusate, ci siamo persi. Vedi modifica. – ebaxt

2

Vecchia domanda ma ho trascorso molto tempo a capire come salvare un database H2 incorporato in un file e voglio condividere ciò che ho imparato.

Come detto @ebaxt, è possibile configurare la posizione del database incorporato all'interno della stringa di connessione. Se si desidera salvare l'uso del file system ~/ sintassi:

jdbc:h2:~/example/embeddedDb 

Se si desidera salvare all'interno della vostra cartella del progetto è necessario utilizzare ./ sintassi

jdbc:h2:./example/embeddedDb 

Questo creerà embeddedDb.mv.db di file nella cartella example all'interno della cartella principale o all'interno della cartella principale del progetto. Ma questo cancellerà il database ogni volta che si avvia l'applicazione. Per evitare questo ho usato la proprietà INIT dire H2 per creare lo schema (coda nel mio caso) solo se non esiste:

INIT=create schema if not exists Queue; 

Poi nello script DDL è necessario utilizzare creare la tabella se non esiste dichiarazione, per creare tutte le tabelle:

// create-db.sql 
    CREATE TABLE IF NOT EXISTS Queue (
     id INTEGER PRIMARY KEY AUTO_INCREMENT, 
     ... 
    ); 

e dire H2 per eseguire lo script ogni volta che si ottiene il collegamento:

// 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' 

Riassumendo questo è quello che devi fare per cre mangiato il database (EmbeddedDb) in modo annotazione:

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; 
    } 

o utilizzando 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> 

Con questo metodo il database verrà creato solo se è la prima volta che si esegue l'applicazione o se il database il file non esiste. Altrimenti verrà caricata solo la connessione.

Si può anche monitorare lo stato del database con una bella interfaccia utilizzando la libreria hsqldb, aggiungendo la seguente fagiolo:

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(); 
    } 

Riferimenti:

http://www.mkyong.com/spring/spring-embedded-database-examples/

http://www.h2database.com/html/features.html#embedded_databases (Esegui SQL nella sezione Connect)

Problemi correlati