如何通过Spring使用脚本初始化内存中的HSQLDB

我试图做我的DAO的unit testing(使用Spring和Hibernate)。 我在本教程中使用HSQLDB。 本教程指出内存中的HSQLDB数据库可以使用SQL脚本进行初始化,但在Spring中找不到有关如何执行的信息。 这里是相关的Spring上下文configuration:

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

任何帮助,将不胜感激。 谢谢。

如果您正在尝试使用内存数据库和Spring,那么Spring 3中有一个新的jdbc命名空间,这使得使用embedded式数据库非常容易。

最好的部分是它作为一个DataSource ,所以它可以很容易地被放入来replace你现有的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中的新增function)。

 @Configuration public class DatabaseTestConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:schema.sql") .addScript("classpath:test-data.sql") .build(); } } 

尼古拉斯的回答是非常好的,但你也可以使用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> 

在你连接的教程中,设置的方法之一就是(明显的更正之后):

  • 内存中的脚本: jdbc:hsqldb:file:path-to-file

我认为这似乎是相关的。 我build议用一些看起来像完全合格的文件名replacepath-to-file文件…

你可以通过创build一个initExecuteSqlFile的子类来获得两个新的属性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> 

使用embedded式数据库,我们只能从同一个JVM连接到数据库。 如果我们有两个JVM,对于性能或其他约束,我们可以:

  1. 您可以使用本答案中build议的数据源,而不是使用embedded式数据库。

  2. 然后像Poitrek Debuild议的那样进行初始化(并在之前的回答中也提出)。 您可能只想创build表,如果它们不存在(如这里所build议的)。