example java spring hsqldb

java - example - Cómo inicializar HSQLDB en memoria usando script a través de Spring



spring boot embedded database (5)

Con la base de datos integrada, solo podríamos conectarnos a la base de datos desde la misma JVM. Si tenemos dos JVM, por rendimiento u otras limitaciones, podemos:

  1. En lugar de utilizar una base de datos integrada, puede usar la fuente de datos sugerida en esta respuesta .

  2. Luego, inicialízate como sugirió Poitrek De (y también en la respuesta anterior ). Es posible que desee crear tablas solo si no existen (como se sugiere here ).

Estoy intentando hacer pruebas unitarias de mi DAO (usando Spring e Hibernate). Estoy usando HSQLDB por this tutorial. El tutorial indica que la base de datos HSQLDB en memoria se puede inicializar usando un script SQL, pero no puedo encontrar información sobre cómo hacerlo en Spring. Aquí está la configuración de contexto 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>

Cualquier ayuda sería apreciada. Gracias.


En el tutorial al que se vincula, una de las formas de configurarlo es esto (después de una corrección obvia):

  • En memoria de un script: jdbc:hsqldb:file:path-to-file

Creo que eso parece ser relevante. Sugiero reemplazar path-to-file con algo que se parece a un nombre de archivo completo ...


La respuesta de Nicholas está perfectamente bien, pero también puedes usar el espacio de nombres jdbc para inicializar la base de datos externa:

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


Podría BasicDataSource esto creando una subclase de BasicDataSource con getters / setters para dos nuevas propiedades, initExecuteSqlFile y destroyExecuteSqlFile , que pueden tener una lista separada por comas de archivos SQL para ejecutar. La subclase tendría los métodos init() y destroy() que manejan los archivos init / destroy SQL.

Luego use la siguiente definición de 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>


Si está tratando de trabajar con bases de datos en memoria y Spring, hay un nuevo espacio de nombres jdbc para Spring 3 que hace que trabajar con bases de datos integradas sea muy fácil.

La mejor parte es que actúa como un DataSource , por lo que puede ser reemplazado fácilmente para reemplazar su dataSource Bean existente.

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

Si está más interesado en hacer esto con Java Config, eche un vistazo al EmbeddedDatabaseBuilder (nuevo en 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(); } }