Как инициализировать HSQLDB в памяти используя скрипт через Spring - PullRequest
35 голосов
/ 17 февраля 2012

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

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

Ответы [ 5 ]

74 голосов
/ 17 февраля 2012

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

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

<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();
    }
}
6 голосов
/ 19 февраля 2014

Ответ Николаса в порядке, но вы можете использовать пространство имен 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 голосов
/ 17 февраля 2012

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

  • В памяти из скрипта: jdbc:hsqldb:file:path-to-file

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

2 голосов
/ 17 февраля 2012

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

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

<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>
0 голосов
/ 06 мая 2014

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

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

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

...