2012-11-01 158 views
10

我目前運行使用嵌入式碼頭和H2數據庫我的行家petproject:Spring H2嵌入式數據庫文件?

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

這種設置每次運行的服務器時間重置我的數據庫。我想將數據庫作爲文件保存在磁盤中,以便在每次啓動服務器時不會丟失數據。我該如何做到這一點?

+1

你能否提供更多關於你想完成的信息?你想切換到另一個數據庫嗎? –

+0

什麼是您的數據庫URL? –

+0

我想將我的H2 DB存儲在磁盤中而不是內存中(就像我現在這樣)。 – Pomario

回答

7

你可以通過連接字符串來控制它。

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

更多信息here

編輯:

好像連接字符串是在春天H2配置hard-coded,所以我認爲這意味着你必須通過擴展EmbeddedDatabaseConfigurer寫你自己的實現,假設有改變的連接沒有其他辦法字符串設置在H2EmbeddedDatabaseConfigurer之後。

+0

按照您的解決方案,我無法找到「mydb」文件。我缺少的東西嗎? \t \t <屬性名= 「driverClassName」 值= 「org.h2.Driver」/> \t \t \t – Pomario

+0

對不起,錯過了。請參閱編輯。 – ebaxt

2

老問題,但我花了很多時間搞清楚如何將一個嵌入式H2數據庫保存到一個文件,我想分享我學到的東西。

由於@ebaxt表示可以在連接字符串中配置嵌入式數據庫的位置。 如果您希望將其保存在文件系統中使用~/語法:如果您想保存您的項目文件夾內

jdbc:h2:~/example/embeddedDb 

你必須使用./語法

jdbc:h2:./example/embeddedDb 

這將創建embeddedDb.mv.db文件在您的主文件夾內的example文件夾中或您的項目根文件夾中。 但是這會在每次應用程序啓動時擦除數據庫。爲了避免這種情況,我用的INIT屬性來告訴H2,以創建模式(隊列在我的情況),只有當它不存在:

INIT=create schema if not exists Queue; 

然後在你的DDL腳本,你必須使用,如果不存在語句來創建表,創建所有的表:

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

,並告訴H2,以每次獲取連接運行該腳本:

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

總結這是你必須做的CRE什麼吃了Java註解的方式數據庫(EmbeddedDb):

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

或使用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> 

用這種方法,只有當它是第一次在應用程序運行的數據庫將被創建或者數據庫文件不存在。否則,只有連接將被加載。

還可以監視與使用hsqldb庫一個漂亮的界面數據庫狀態,添加以下豆:

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

參考文獻:

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

http://www.h2database.com/html/features.html#embedded_databases(執行SQL上連接部分)

相關問題