Как инициализировать 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>
Любая помощь будет оценена по достоинству. Спасибо.
Ответы
Ответ 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 (и предложили в предыдущем ответе). Вы можете создавать таблицы только в том случае, если они не существуют (как предложено здесь).