Breve descripción de HSQLDB

De ChuWiki

He metido todos los artículos de esta wiki y de http://chuidiang.org relativos a Java y JDBC en un pdf Libro JDBC Java. A través del enlace puedes comprarlo si tienes interés.

Descripción[editar]

HSQLDB es una base de datos hecha totalmente en java, pero que tiene características muy interesantes para usarla con Applets o en test automáticos.

Por un lado, se puede arrancar un servidor de base de datos HSQLDB y conectarse a él desde java como a cualquier otra base de datos, utilizando, por supuesto, el driver suministrado por HSQLDB.

Por otro lado, sin necesidad de arrancar un servidor y sobre la marcha, una aplicación java puede conectarse a una base de datos HSQLDB ficticia que se guardará en fichero. De esta forma, sin servidor de base de datos, podemos crear tablas y llenarlas de datos que se guardarán en un fichero, y luego recuperarlos. Eso sí, lo haremos siempre usando el lenguaje SQL típico de las bases de datos, la clase Connection, Statement y Resulset. NO tendremos que usar las clases y métodos típicos de la escritura en fichero, como File, PrintWriter, FileOutputStream, etc.

Finalmente, podemos hacer lo mismo que en el caso anterior, pero sobre memoria. No se escribe ningún dato en ningún sitio y cuando la aplicación termine se perderán los datos. Esta posiblidad es muy útil para Applets o para test automáticos de prueba. En un test automático de prueba, podemos crear la base de datos en memoria con sus tablas y comprobar el comportamiento de la clase bajo test.

Ejemplos de conexión en Java[editar]

Vamos a ver unos ejemplos en java de conexión con estas tres modalidades


Conexión con un servidor HSQLDB[editar]

En primer lugar, debemos arrancar el servidor de HSQLDB. Para ello, ponemos el jar de HSQLDB en el classpath (supongamos que está en el directorio actual) y ejecutamos el siguiente comando:

java -cp hsqldb-1.8.0.7.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb

donde

  • hsqldb-1.8.0.7.jar es el jar de HSQLDB
  • org.hsqldb.Server es la clase con el main que arranca el servidor de HSQLDB
  • -database.0 flle:mydb le indica al servidor que debe guardar los datos de la base de datos en un conjunto de ficheros cuyo nombre empieza por mydb.
  • -dbname.0 xdb le indica al servidor que la base de datos se llamará xdb

Ahora, desde java, la conexión la realizamos así

 Class.forName("org.hsqldb.jdbcDriver");
 try {
    Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb");
    ...
 } catch (SQLException e) {
    e.printStackTrace();
 }

donde la cadena de conexión es "jdbc:hsqldb:hsql://localhost/xdb". La parte jdbc:hsqldb:hsql es fija, localhost sería el servidor donde hemos arrancado el servidor de hsqldb (en el mismo ordenador, puesto que hemos puesto localhost) y xdb el nombre de la base de datos (como pusimos en el parámetro -dbname.0 al arrancar el servidor).

Una vez que trabajamos con la base de datos de forma normal, podemos tirar el servidor llamando a una SQl "shutdown" o bien lo "matamos" con un Ctrl-C en el sitio que lo arrancamos.

Statement st = connection.createStatement();
st.execute("shutdown");
connection.close();

El servidor guarda en ficheros (según indicamos con la opción -database.0 file:mydb) los datos que guardamos en la base de datos. Tal cual lo hemos puesto, este fichero se guarda en el directorio en el que hemos arrancado el servidor de base de datos. Debemos tenerlo en cuenta para que la próxima vez que lo arranquemos encuentre este fichero. Podríamos haber puesto un path si lo hubiesemos deseado.

Conexión con base de dastos HSQLDB en fichero[editar]

Para esta opción no es necesario arrancar un servidor de HSQLDB. Nuestra propia aplicación símplemente indica el nombre del fichero y establece la conexión. Sobre el fichero sólo puede haber una aplicación trabajando con una única conexión, por lo que esta opción es buena para una base de datos interna a nuestra aplicación, a la que en principio nadie más debería querer acceder

Desde java, la conexión se establece igual, pero la cadena de conexión cambia

 Class.forName("org.hsqldb.jdbcDriver");
 try {
    Connection connection = DriverManager.getConnection("jdbc:hsqldb:file:ficherodb");
    ...
 } catch (SQLException e) {
    e.printStackTrace();
 }

En la url de conexión, ficherodb es el nombre incicial del conjunto de ficheros que usará HSQLDB. Podemos poner también un path si lo deseamos.

Es importante echar la base de datos abajo con la SQl "shutdown" para obligar de alguna manera a que el fichero se escriba realmente en disco.

Statement st = connection.createStatement();
st.execute("shutdown");
connection.close();


Conexión con base de datos HSQLDB en memoria[editar]

Con esta opción la base de datos está en memoria, por lo que desaparece cuando muere nuestra aplicación. Se puede usar para almacen interno temporal de datos o para test unitarios. Por ejemplo, un test de JUnit con el que queremos probar una clase que accede a base de datos. El test de JUnit puede crear una base de datos en memoria, rellenarla con unos datos conocidos y luego llamar a la clase bajo test pasándole la Connection. Una vez que la clase bajo test termine su trabajo, el test de JUnit puede revisar la base de datos para ver si se han efectuado los cambios esperados o interrogar a la clase bajo test para ver si ha leido lo que tenía que leer.

Para la conexión basta nuevamente cambiar la url

 Class.forName("org.hsqldb.jdbcDriver");
 try {
    Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:memoriadb");
    ...
 } catch (SQLException e) {
    e.printStackTrace();
 }

Hemos cambiado el file por mem y luego hemos añadido el nombre de nuestra base de datos memoriadb.

Enlaces[editar]