Spring H2 встроенный файл базы данных?

В настоящее время я запускаю свой проект petnet на maven, используя встроенную базу данных причала и H2:

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

Эта настройка сбрасывает мою БД каждый раз, когда я запускаю сервер. Я хочу сохранить 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)