2012-11-01 204 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上连接部分)

相关问题