Подтвердить что ты не робот

Как инициализировать HSQLDB в памяти с помощью script через Spring

Я пытаюсь выполнить модульное тестирование моего DAO (используя Spring и Hibernate). Я использую HSQLDB за этот учебник. В учебнике указано, что база данных HSQLDB в памяти может быть инициализирована с использованием SQL script, но я не могу найти информацию о том, как это сделать в Spring. Вот подходящий контекстный контекст Spring:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:mydb" />
    <property name="username" value="sa" />
    <property name="password" value="" />
    <property name="initialSize" value="5" />
    <property name="maxActive" value="10" />
    <property name="poolPreparedStatements" value="true" />
    <property name="maxOpenPreparedStatements" value="10" />
</bean> 

Любая помощь будет оценена по достоинству. Спасибо.

4b9b3361

Ответ 1

Если вы пытаетесь работать с базами данных в памяти и Spring, существует новое пространство имен jdbc для Spring 3, что упрощает работу со встроенными базами данных.

Лучшая часть состоит в том, что она действует как DataSource, поэтому ее можно легко отбросить, чтобы заменить существующий DataSource bean.

<jdbc:embedded-database id="dataSource" type="HSQL">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

Если вы больше заинтересованы в этом с помощью Java Config, посмотрите EmbeddedDatabaseBuilder (новый в Spring 3.0).

@Configuration
public class DatabaseTestConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.HSQL)
            .addScript("classpath:schema.sql")
            .addScript("classpath:test-data.sql")
            .build();
    }
}

Ответ 2

Ответ на Nicholas отлично, но вы можете использовать пространство имен jdbc для инициализации внешней базы данных:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/DS"/>

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:/META-INF/database/init.sql"/>
</jdbc:initialize-database>

Ответ 3

В учебном пособии, к которому вы ссылаетесь, один из способов настройки вещей - это (после очевидной коррекции):

  • В памяти от script: jdbc:hsqldb:file:path-to-file

Я думаю, что это будет иметь значение. Я предлагаю заменить path-to-file на то, что выглядит как полностью квалифицированное имя файла...

Ответ 4

Вы можете обойти это, создав подкласс BasicDataSource с помощью геттеров/сеттеров для двух новых свойств, initExecuteSqlFile и destroyExecuteSqlFile, который может иметь разделенный запятыми список файлов SQL для выполнения. Подкласс будет иметь методы init() и destroy(), которые обрабатывают файлы init/destroy SQL.

Затем используйте следующее определение bean:

<bean
    id="datasource"
    class="com.example.MyBasicDataSource"
    destroy-method="destroy"
    init-method="init"
>
    <property name="destroyExecuteSqlFile">
        <value>h2-destroy-01.sql</value>
    </property>
    <property name="initExecuteSqlFile">
        <value>h2-init-01.sql,h2-init-02.sql,h2-init-03.sql</value>
    </property>
    <!-- Other properties -->
</bean>

Ответ 5

Со встроенной базой данных мы могли бы только подключиться к базе данных из одной JVM. Если у нас есть два JVM, для производительности или других ограничений, мы можем:

  • Вместо использования встроенной базы данных вы можете использовать источник данных, предложенный в этом ответе.

  • Затем инициализируйте, например, Poitrek De (и предложили в предыдущем ответе). Вы можете создавать таблицы только в том случае, если они не существуют (как предложено здесь).