10

我目前使用嵌入式码头和 H2 数据库在 maven 上运行我的 petproject:

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

每次运行服务器时,此设置都会重置我的数据库。我想将数据库保存为磁盘中的文件,这样我就不会在每次服务器启动时丢失数据。我该如何做到这一点?

4

2 回答 2

10

您可以通过连接字符串来控制它。

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

更多信息在这里

编辑:

似乎连接字符串在 spring H2 配置中是硬编码的,所以我假设这意味着您必须通过扩展EmbeddedDatabaseConfigurer来编写自己的实现,假设在H2EmbeddedDatabaseConfigurer.

于 2012-11-05T13:17:37.267 回答
4

老问题,但我花了很多时间弄清楚如何将嵌入式 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 table if not exists 语句来创建所有表:

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

总结一下,这就是以 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库通过一个漂亮的界面监控数据库状态,添加以下 bean:

    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)

于 2017-01-27T16:34:31.867 回答