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

Я пытаюсь выполнить модульное тестирование моего 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> 

Любая помощь будет оценена. Благодарю.

 John B17 февр. 2012 г., 15:25
Я читал выше, но я полагаю, что я не соединил 2 и 2, чтобы потом вы использовали «файловую» версию HSQLDB, и это сделало бы в памяти сценарий в качестве запуска.
 baba.kabira17 февр. 2012 г., 15:17
The difference between the in-memory and the file mode is that the in-memory database is empty, but the file mode is initialized with data. One strategy that I have employed in the past is to create a standalone database, allow Hibernate to create the tables and add data for me, save the data into a script, and then use the file-based URL to point to the script. The good thing about the script is that it is raw SQL so you are free to pre-populate the database with whatever data you want to test against. это из поста, который вы связали, он явно упоминает процесс.

Ответы на вопрос(5)

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

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

<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>
 udalmik25 янв. 2013 г., 15:22
Таким образом, нам все еще нужно реализовать некоторую заполняющую логику внутри init ()?
Решение Вопроса

есть новый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 (новая версия весной 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();
    }
}
 Dan Cruz17 февр. 2012 г., 15:30
+1. мойответ работает на Spring 2.X; теперь, когда мы находимся на Spring 3.X, я думаю, что мы перейдем к этому подходу.
 John B17 февр. 2012 г., 15:13
Это похоже на ответ. Я играл с HSQLDB и встраиваемой базой данных, пытаясь заставить либо работать. Пока что кажется, что EB работает хорошо.
 nicholas.hauschild17 февр. 2012 г., 15:38
Я обнаружил, что это просто просмотр документации Spring 3 около 6 месяцев назад. Он невероятно прост в использовании (не то, что метод вашего ответа не таков), и я уже смог проверить его несколько раз.
 iwein18 июн. 2012 г., 10:58
Я думаю, что это также хорошо, чтобы упомянуть обязательную зависимость от hsqldb

на который вы ссылаетесь, один из способов настроить это (после очевидного исправления):

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

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

 Tim Perry13 мар. 2012 г., 16:34
Для справки других людей: когда вы делаете это, он запускает его главным образом в памяти, это очень быстро, но если вы сделаете изменения, это в конечном итоге сбросит их обратно на диск, что, вероятно, не то, что вам нужно. Чтобы это исправить, вам нужно установить опцию hsqldb «files_readonly». Делать это в строке подключения недопустимо, но вы можете сделать это в файле свойств БД: при первом запуске вышеописанного он создаст [путь к файлу] .properties, если он еще не существует , Добавьте в конец новую строку с надписью «hsqldb.files_readonly = true», и все готово.
 Donal Fellows17 февр. 2012 г., 15:19
@John: Обычно он поддерживает его в памяти по умолчанию (настраивается отдельно для каждой таблицы), хотя переносится на диск и сохраняется. Увы, документация не очень ясна о мелких деталях того, что именно должно быть там; Думаю, вам придется немного поэкспериментировать, и все станет ясно. (Это немного неубедительно с моей стороны…)
 John B17 февр. 2012 г., 15:00
Но поддерживает ли это БД в файле, а не в памяти? Могу ли я предположить, что это безопасно, если откатить все переводы?

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

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

Затем инициализировать какПойтрек Де предложил (и предложил впредыдущий ответ слишком). Возможно, вы захотите создавать таблицы, только если они не существуют (как предложеноВот).

Николай отвечает отлично, но вы можете использовать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>

Ваш ответ на вопрос