web-dev-qa-db-fra.com

Comment initialiser HSQLDB en mémoire à l'aide d'un script via Spring

J'essaie de faire des tests unitaires de mon DAO (en utilisant Spring et Hibernate). J'utilise HSQLDB par ce tutoriel. Le didacticiel indique que la base de données HSQLDB en mémoire peut être initialisée à l'aide d'un script SQL mais je ne trouve pas d'informations sur la façon de le faire dans Spring. Voici la configuration de contexte Spring pertinente:

 <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> 

Toute aide serait appréciée. Merci.

35
John B

Si vous essayez de travailler avec des bases de données en mémoire et Spring, il existe un nouvel espace de noms jdbc pour Spring qui rend le travail avec les bases de données intégrées très facile.

La meilleure partie est qu'il agit comme un DataSource, donc il peut facilement être déposé pour remplacer votre bean dataSource existant.

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

Si vous êtes plus intéressé à le faire avec Java Config, jetez un œil à EmbeddedDatabaseBuilder (nouveau dans 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
nicholas.hauschild

La réponse de Nicholas est parfaitement correcte, mais vous pouvez également utiliser jdbc namespace pour initialiser la base de données externe:

<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

Dans le didacticiel auquel vous accédez, l'une des façons de configurer les choses est la suivante (après une correction évidente):

  • En mémoire à partir d'un script: jdbc:hsqldb:file:path-to-file

Je pense que cela semble pertinent. Je suggère de remplacer path-to-file avec quelque chose qui ressemble à un nom de fichier complet…

3
Donal Fellows

Vous pouvez contourner cela en créant une sous-classe de BasicDataSource avec des getters/setters pour deux nouvelles propriétés, initExecuteSqlFile et destroyExecuteSqlFile, qui peuvent avoir un liste séparée par des virgules de fichiers SQL à exécuter. La sous-classe aurait des méthodes init() et destroy() qui gèrent les fichiers SQL init/destroy.

Utilisez ensuite la définition de bean suivante:

<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

Avec la base de données intégrée, nous ne pourrions nous connecter à la base de données qu'à partir de la même machine virtuelle Java. Si nous avons deux JVM, pour les performances ou autres contraintes, nous pouvons:

  1. Au lieu d'utiliser une base de données intégrée, vous pouvez utiliser la source de données suggérée dans cette réponse .

  2. Ensuite, initialisez comme Poitrek De suggéré (et suggéré dans réponse précédente aussi). Vous pouvez créer des tableaux uniquement s'ils n'existent pas (comme suggéré ici ).

0
user1026870