我目前使用嵌入式码头和 H2 数据库在 maven 上运行我的 petproject:
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="/WEB-INF/database.sql"/>
</jdbc:embedded-database>
每次运行服务器时,此设置都会重置我的数据库。我想将数据库保存为磁盘中的文件,这样我就不会在每次服务器启动时丢失数据。我该如何做到这一点?
您可以通过连接字符串来控制它。
jdbc:h2:~/test; # saves to the file ~/test
jdbc:h2:mem:db1 # in memory
更多信息在这里。
编辑:
似乎连接字符串在 spring H2 配置中是硬编码的,所以我假设这意味着您必须通过扩展EmbeddedDatabaseConfigurer来编写自己的实现,假设在H2EmbeddedDatabaseConfigurer
.
老问题,但我花了很多时间弄清楚如何将嵌入式 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)