viernes, 23 de mayo de 2008

HSQLDB: Instalación y uso

Objetivos


Contar con una base de datos de prueba para nuestras aplicaciones.
Es fácil de instalar y proporciona las utilidades básicas. Está basada en ficheros.
Esta base de datos permite varios modos de ejecución, entre los que destaco:

  • Modo standalone: La base de datos se ejecuta incrustada en el proceso que hará uso de ella de manera que no dependamos de nada más que de nuestra aplicación

  • Modo servidor: La base de datos se ejecuta como un servidor separada de nuestra aplicación pero estando así disponible para cualquier proceso y desde cualquier equipo de la red.


Requisitos antes de empezar



hsqldb.jar [http://www. hsqldb.org/]

Arranque de la base de datos


Si queremos utilizar HSQL en modo servidor:

Creamos un directorio que servirá como almacén de los datos: data
Arrancamos el servidor con la orden java desde el directorio de datos:
C:\data>java -classpath [rutaHsqldb]\hsqldb.jar org.hsqldb.Server


Si queremos utilizar HSQL en modo standalone

En este caso el arranque de la base de datos se hace desde la propia aplicación que utilizará la base de datos.

Administración gráfica


La propia librería proporciona una utilidad gráfica
>java -classpath [rutaHsqldb]\hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

Al ejecutar el comando aparece un panel de conexión, donde podemos seleccionar los parámetros de conexión. La siguiente figura nos conecta a una base de datos HSQL arrancada en modo servidor en nuestra máquina:

HSQLDB Pantallazo de administración gráfica

Conexión desde Java


Base de datos arrancada en modo standalone


try {
Class.forName("org.hsqldb.jdbcDriver" );
} catch (Exception e) {
System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
e.printStackTrace();
return;
}

Connection c =
DriverManager.getConnection("jdbc:hsqldb:file:data/pruebahsql", "sa", "");

Base de datos arrancada en modo servidor


try {
Class.forName("org.hsqldb.jdbcDriver" );
} catch (Exception e) {
System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
e.printStackTrace();
return;
}

Connection c =
DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/alias", "sa", "");

NOTAS

  • Debe haberse arrancado previamente la base de datos con
    #java -classpath [rutaHsqldb]\hsqldb.jar org.hsqldb.Server


  • Si no se ha definido alias, no es necesario ponerlo


NOTA
En algunas ocasiones hay que escribir la línea siguiente para obtener la conexión:
Class.forName("org.hsqldb.jdbcDriver").newInstance();

Ejemplo completo


En este ejemplo se muestra el uso de una base de datos incluida en el propio proceso de nuestra aplicación.
Se muestra cómo se arranca la base de datos (y se crea si no existe), se crea una tabla, se añaden registros y finalmente se recuperan.

package es.arcoe;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Conector {

private static Connection dbcon;
public static Connection getConexion(){

if (dbcon==null){
try {
Class.forName("org.hsqldb.jdbcDriver" );
dbcon =
DriverManager.getConnection("jdbc:hsqldb:file:data/pruebahsql",
"sa", "");
}catch (Exception e) {
System.out.println("ERROR: Fallo al conectar con HSQLDB JDBC driver.");
e.printStackTrace();
}
}
return dbcon;
}

public static void endConexion(){
if (dbcon!=null){
try {
dbcon.close();
}catch (Exception e) {
System.out.println("ERROR: Fallo al cerrar HSQLDB.");
e.printStackTrace();
}
}
}

public static void main(String[] args) {
//creo un statement de la conexión
try{
Statement stmt = Conector.getConexion().createStatement();
//Borramos la tabla de prueba que utilizaremos
try{stmt.executeQuery("DROP TABLE PRUEBAHSQL");}
catch(java.sql.SQLException e){}

//Creamos una tabla PRUEBAHSQL CON COLUMNAS ID, NOMBRE, APELLIDO, EDAD
stmt.executeQuery("CREATE TABLE PRUEBAHSQL (ID BIGINT PRIMARY KEY, "+
"EDAD INTEGER,NOMBRE VARCHAR(255),APELLIDO "+
"VARCHAR(255))");

//Insertamos dos registros
stmt.executeQuery("INSERT INTO PRUEBAHSQL (ID,EDAD,NOMBRE,APELLIDO) "+
"VALUES (1,22,'Manuel', 'Manuélez')");
stmt.executeQuery("INSERT INTO PRUEBAHSQL (ID,EDAD,NOMBRE,APELLIDO) "+
"VALUES (2,24,'José' , 'Joselez')");

// Realizamos una modificación de un registro
stmt.executeUpdate("UPDATE PRUEBAHSQL SET APELLIDO='Josélez' WHERE ID=2");

//Obtenemos los registros de la BBDD para mostrarlos por consola
ResultSet resultado = stmt.executeQuery("select * from PRUEBAHSQL");
while (resultado.next()){
System.out.println(resultado.getString("NOMBRE") +
" " +resultado.getString("APELLIDO")+ ": "+
resultado.getInt("EDAD") + " años" );

}
resultado.close();//liberamos resultados

stmt.close();//liberamos recursos

Conector.endConexion();//cerramos conexión

}catch(Exception e){
System.out.println("ERROR: Fallo al recoger datos de la bbdd.");
e.printStackTrace();
}

}

}

NOTA
Es necesario tener en el classpath la librería hsqldb.jar

Problemas típicos con código PHP

__PHP_Incomplete_Class en variables de sesión
Se produce cuando intentamos utilizar una variable de sesión cuyo tipo aun no ha sido declarado.
Se debe a que no se ha encontrado la declaración de la clase antes de abrir la sesión con session_start(). Para que no ocurra hay que cargar la definición de la clase que quieres que persista, antes de iniciar una sesión.

Sería correcto:

class MiClase(){
...
}
session_start();
$_SESSION[“variableMiClase”]->

Warning: Cannot modify header information - headers already sent by …
Posiblemente sea que estemos incluyendo o requiriendo en nuestro archivo otros ficheros, y en alguno de ellos haya espacios en blanco antes o después de las etiquetas .
Abrir el archivo y borrar todos los espacios en blanco por que haya por fuera de dichas etiquetas y asunto arreglado.

Esto se debe a que la cabecera no puede modificarse una vez haya habido salida.

Por ejemplo:
global.php

<?
define(“prueba”,”prueba”);
?>

<?
define(“prueba2”,”preba2”);
?>

pagina.php

<?include_once("global.php");?>
<?header(“….”);
...
?>

En el ejemplo se ve como en el fichero global.php, que incluimos desde pagina.php, hay un espacio entre las dos secciones de código PHP. Este espacio está provocando la salida que impide que más tarde en pagina.php podamos modificar la cabecera. Ojo, porque el espacio que provoca el error también puede estar al comienzo de un fichero o al final en un salto de línea inesperado.

Referencias:
www.xinterface.net