web-dev-qa-db-ja.com

Spring経由でスクリプトを使用してインメモリHSQLDBを初期化する方法

DAOのユニットテストを実行しようとしています(SpringとHibernateを使用)。 this チュートリアルごとに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> 

任意の助けをいただければ幸いです。ありがとう。

35
John B

インメモリデータベースとSpringを使用する場合、新しい Spring 3のjdbc名前空間 があり、組み込みデータベースの操作が非常に簡単になります。

最良の部分は、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();
    }
}
74

ニコラスの答えはまったく問題ありませんが、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>
6
omnomnom

リンクするチュートリアルで、設定の方法の1つは次のとおりです(明らかな修正後)。

  • スクリプトからのメモリ内:jdbc:hsqldb:file:path-to-file

それは関連があるように思われると思います。 path-to-file完全修飾ファイル名のように見えるもの…

3
Donal Fellows

これを回避するには、 BasicDataSource のサブクラスを作成し、2つの新しいプロパティinitExecuteSqlFiledestroyExecuteSqlFileのゲッター/セッターを使用します。実行するSQLファイルのコンマ区切りリスト。サブクラスには、init/destroy SQLファイルを処理するinit()およびdestroy()メソッドがあります。

次に、次の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>
2
Dan Cruz

組み込みデータベースでは、同じJVMからのみデータベースに接続できます。パフォーマンスまたはその他の制約のために2つのJVMがある場合、次のことができます。

  1. 埋め込みデータベースを使用する代わりに、 この回答 で提案されているデータソースを使用できます。

  2. 次に Poitrek De のように初期化します(および 前の回答 でも推奨されます)。テーブルが存在しない場合にのみ作成することもできます( here を推奨)。

0
user1026870