В настоящее время я запускаю свой проект petnet на maven, используя встроенную базу данных причала и H2:
Эта настройка сбрасывает мою БД каждый раз, когда я запускаю сервер. Я хочу сохранить DB как файл на диске, чтобы я не потерял свои данные при каждом запуске сервера. Как это сделать?
Ответ 1
Вы можете управлять этим по строке подключения.
jdbc:h2:~/test; # saves to the file ~/test
jdbc:h2:mem:db1 # in memory
Подробнее здесь.
EDIT:
Похоже, что строка соединения жестко закодирована в конфигурации spring H2, поэтому я предполагаю, что это означает, что вы должны написать свою собственную реализацию, расширив EmbeddedDatabaseConfigurer, предполагая, что нет другого способа изменить строку соединения после ее установки в H2EmbeddedDatabaseConfigurer
.
Ответ 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 script вам нужно использовать инструкцию create table, если не существует, для создания всех ваших таблиц:
// create-db.sql
CREATE TABLE IF NOT EXISTS Queue (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
...
);
и скажите H2, чтобы запустить script каждый раз, когда он получает соединение:
// 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'
Подводя итог этому, вам нужно сделать, чтобы создать базу данных (EmbeddedDb) в виде аннотации java:
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 on Connect)