En nuestro anterior artículo de Introducción a Berkeley DB hemos presentado este sistema de base de datos y hemos comentado sobre las características y funcionalidad que ofrece. En éste vamos a ver ejempos prácticos de uso de Berkeley DB en un programa Java.
Versiones de la librería java para Berkeley DB
Existen dos versiones distintas de la librería Java para Berkeley DB.
Berkeley DB standard
Por una parte, el package com.sleepycat.db es un interfaz con la librería del sistema utilizada por otros lenguajes como C, Perl y PHP. Esto asegura la compatibilidad, de manera que una base de datos Berkeley previamente existente creada por un programa escrito en otro lenguaje, puede ser utilizada por un programa Java, y viceversa.
Berkeley DB Java Edition
Por otra parte el package com.sleepycat.je es una implementación 100% Java, que asegura la portabilidad entre distintas plataformas.
En este artículo exponemos la manera de trabajar con Berkeley DB Java Edition.
Instalación de Berkeley DB Java Edition
Berkeley DB dispone de una versión 100% java. Para obtenerla, accedemos a la página de descarga de Berkeley DB:
http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html
En ella, descargamos el fichero Berkeley DB Java Edition 5.0.58.tar.gz (13M)
Para instalarlo, simplemente lo descomprimimos en el directorio que deseemos. Si descargamos la versión comprimida en zip del fichero, debemos descomprimirlo utilizando la opción -U para mantener las mayúsculas y minúsculas.
Una vez instalado, para utilizar Berkeley DB Java Edition en un programa, debemos añadir al classpath el fichero je-5.0.58/lib/je-5.0.58.jar.
En el subdirectorio je-5.0.58/lib podemos encontrar también otras versiones de la librería, incluyendo una específica para Android:
je-5.0.58/lib$ ls -l total 4952 -r--r--r-- 1 openalfa openalfa 2471774 Jul 17 2012 je-5.0.58.jar -r--r--r-- 1 openalfa openalfa 2441012 Jul 17 2012 je-android-5.0.58.jar -r--r--r-- 1 openalfa openalfa 55078 Jul 17 2012 JEJConsole.jar -r--r--r-- 1 openalfa openalfa 79494 Jul 17 2012 RepJEJConsole.jar
Creación, apertura y cierre de una base de datos
Para abrir una base de datos utilizamos el siguiente código, que comentamos a continuación:
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import java.io.File;
public class PruebaBDB {
public static void main(String[] args) {
Environment myDbEnvironment = null;
Database myDatabase = null;
try {
// Abre el entorno, creándolo si no existe
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
myDbEnvironment = new Environment(new File("/tmp/dbEnv"),
envConfig);
// Abre la base de datos, creándola si no existe
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
myDatabase = myDbEnvironment.openDatabase(null,
"DatabasePrueba", dbConfig);
} catch (DatabaseException dbe) {
// Manejo de excepciones
}
}
}
Para abrir una base de datos Berkeley, necesitamos utilizamos el método openDatabase de un objeto “Environment”, por lo que debemos comenzar por crear el objeto con una llamada a “new Environment”.
Por otra parte, tanto al crear/abrir el objeto Environment como el objeto Database, debemos pasarle la configuración en forma de objetos de las clases EnvironmentConfig y DatabaseConfig, respectivamente. En ambos objetos de configuración, hacemos una llamada al método “setAllowCreate”, para que tanto el entorno como la base de datos se creen si no existían previamente.
Cuando finalizamos de utilizarla, cerramos la base de datos y el entorno con las sentencias:
try {
if (myDatabase != null) {
myDatabase.close();
}
if (myDbEnvironment != null) {
myDbEnvironment.close();
}
} catch (DatabaseException dbe) {
// Manejo de excepciones
}
Para compilar y ejecutar el programa “PruebaBDB.java”, utilizamos los comandos:
$ javac -classpath je-5.0.58/lib/je-5.0.58.jar PruebaBDB.java $ java -classpath .:je-5.0.58/lib/je-5.0.58.jar PruebaBDB
Escribir registros en la base de datos
Para escribir un registro en la base de datos hacemos una llamada al método “put()” de la clase Database. A este método debemos pasarle la clave y el valor del registro en forma de objetos de la clase “DatabaseEntry”.
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
...
String clave = "miClave";
String datos = "misDatos";
try {
DatabaseEntry laClave = new DatabaseEntry(clave.getBytes("UTF-8"));
DatabaseEntry losDatos = new DatabaseEntry(datos.getBytes("UTF-8"));
myDatabase.put(null, laClave, losDatos);
} catch (Exception e) {
// Manejo de excepciones
}
Leer registros de la base de datos
Para obtener un registro de la base de datos hacemos una llamada al método “get()” de la clase Database. Este método devuelve un objeto de la clase DataEntry, que deberemos convertir al tipo de objeto deseado:
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
...
String clave= "miClave";
try {
// Crear un par de objetos de la clave DatabaseEntry
// laClave se utiliza para realizar la búsqueda, losDatos
// contendrá el valor asociado a la clave, si ésta es encontrada
DatabaseEntry laClave = new DatabaseEntry(clave.getBytes("UTF-8"));
DatabaseEntry losDatos = new DatabaseEntry();
// Realizar la consulta con una llamada a get()
if (myDatabase.get(null, laClave, losDatos, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
// Traducir el objeto losDatos en un String.
byte[] retData = losDatos.getData();
String foundData = new String(retData, "UTF-8");
System.out.println("clave: '" + clave + "' datos: '" +
foundData + "'.");
} else {
System.out.println("No se ha encontrado el registro para la clave '" + clave + "'.");
}
} catch (Exception e) {
// Manejo de excepciones
}
Eliminar registros
Para eliminar un registro llamamos al método “delete” del objeto Database:
try {
String clave = "miClave";
DatabaseEntry laClave = new DatabaseEntry(clave.getBytes("UTF-8"));
// Borra el (los) registro(s) asociados a la clave
myDatabase.delete(null, laClave);
} catch (Exception e) {
// Manejo de excepciones
}
Recorrer todos los registros de la base de datos
Para procesar todo los registros, utilizamos un cursor:
import com.sleepycat.je.Cursor;
Cursor miCursor = null;
try {
miCursor = myDatabase.openCursor(null, null);
// Los cursores devuelven cada registro en dos objetos de la clase DatabaseEntry
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
// Recorremos la base de datos llamando a getNext() hasta que devuelve
// un status distinto de OperationStatus.SUCCESS
while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
String keyString = new String(foundKey.getData(), "UTF-8");
String dataString = new String(foundData.getData(), "UTF-8");
System.out.println("Clave | Datos : " + keyString + " | " +
dataString + "");
}
} catch (DatabaseException de) {
System.err.println("Error accediendo a la base de datos: " + de);
} finally {
try {
if (miCursor != null) {
miCursor.close();
}
} catch(DatabaseException dbe) {
System.err.println("Error en close: " + dbe.toString());
}
}
Referencias
Getting Started with Berkeley DB Java Edition
—