首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring H2嵌入式数据库文件?

Spring H2嵌入式数据库文件?
EN

Stack Overflow用户
提问于 2012-11-01 23:55:52
回答 2查看 10K关注 0票数 10

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

代码语言:javascript
复制
<jdbc:embedded-database id="dataSource" type="H2">
   <jdbc:script location="/WEB-INF/database.sql"/>
</jdbc:embedded-database>

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

EN

回答 2

Stack Overflow用户

发布于 2012-11-05 21:17:37

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

代码语言:javascript
复制
jdbc:h2:~/test; # saves to the file ~/test
jdbc:h2:mem:db1 # in memory

更多信息here

编辑:

在spring H2配置中,连接字符串似乎是hard-coded,所以我认为这意味着您必须通过扩展EmbeddedDatabaseConfigurer来编写自己的实现,假设在H2EmbeddedDatabaseConfigurer中设置连接字符串之后没有其他方法可以更改连接字符串。

票数 10
EN

Stack Overflow用户

发布于 2017-01-28 00:34:32

老问题,但我花了很多时间弄清楚如何将嵌入式H2数据库保存到一个文件中,我想分享我学到的东西。

正如@ebaxt所说,您可以在连接字符串中配置嵌入式数据库的位置。如果要将其保存在文件系统中,请使用~/语法:

代码语言:javascript
复制
jdbc:h2:~/example/embeddedDb

如果要将其保存在项目文件夹中,则必须使用./语法

代码语言:javascript
复制
jdbc:h2:./example/embeddedDb

这将在您的主文件夹或项目根文件夹内的example文件夹中创建embeddedDb.mv.db文件。但这将在每次应用程序启动时擦除数据库。为了避免这种情况,我使用INIT属性告诉H2只有在模式不存在时才创建模式(在我的例子中是队列):

代码语言:javascript
复制
INIT=create schema if not exists Queue;

然后,在DDL脚本中,您必须使用create table if not exists语句来创建所有表:

代码语言:javascript
复制
// create-db.sql
    CREATE TABLE IF NOT EXISTS Queue (
       id INTEGER PRIMARY KEY AUTO_INCREMENT,
       ...
   );

并告诉H2在每次获得连接时运行脚本:

代码语言:javascript
复制
// 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),您必须执行以下操作:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    <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,通过一个很好的界面监视数据库状态:

代码语言:javascript
复制
    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部分)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13180781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档