我目前在maven上使用嵌入式jetty和H2数据库运行我的petproject:
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="/WEB-INF/database.sql"/>
</jdbc:embedded-database>这个设置会在我每次运行服务器时重置我的数据库。我希望将数据库作为文件保存在磁盘中,这样我就不会在每次启动服务器时丢失数据。我该如何做到这一点?
发布于 2012-11-05 21:17:37
你可以通过连接字符串来控制它。
jdbc:h2:~/test; # saves to the file ~/test
jdbc:h2:mem:db1 # in memory更多信息here。
编辑:
在spring H2配置中,连接字符串似乎是hard-coded,所以我认为这意味着您必须通过扩展EmbeddedDatabaseConfigurer来编写自己的实现,假设在H2EmbeddedDatabaseConfigurer中设置连接字符串之后没有其他方法可以更改连接字符串。
发布于 2017-01-28 00:34:32
老问题,但我花了很多时间弄清楚如何将嵌入式H2数据库保存到一个文件中,我想分享我学到的东西。
正如@ebaxt所说,您可以在连接字符串中配置嵌入式数据库的位置。如果要将其保存在文件系统中,请使用~/语法:
jdbc:h2:~/example/embeddedDb如果要将其保存在项目文件夹中,则必须使用./语法
jdbc:h2:./example/embeddedDb这将在您的主文件夹或项目根文件夹内的example文件夹中创建embeddedDb.mv.db文件。但这将在每次应用程序启动时擦除数据库。为了避免这种情况,我使用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部分)
https://stackoverflow.com/questions/13180781
复制相似问题