Académique Documents
Professionnel Documents
Culture Documents
Juan B. Cabral
UTN - FRC - TSB
V. 1.0.1b - 2009/10/13
Introducción.
DB4O es un novedoso motor de base de datos orientada a objetos. Sus siglas se corresponden
con la expresión "DataBase 4 (for) Objects", que a su vez es el nombre de la compañía
que lo desarrolla: db4objects, Inc.
Las claves innovadoras de este producto es su alto rendimiento (sobre todo en modo
embebido) y el modelo de desarrollo que proporciona a las aplicaciones para su capa de
acceso a datos, el cual propugna un abandono completo del paradigma relacional de las
bases de datos tradicionales.
De este modo, tenemos las siguientes consecuencias directas resultantes de este nuevo
paradigma:
● Deja de existir un lenguaje SQL de consultas/modificaciones para pasar a crearse
sistemas de consulta por métodos delegados y actualización/creación/borrado
automático de entidades mediante código compilable.
● Se elimina la necesidad de representar el modelo de datos de la aplicación en dos
tipos de esquemas: modelo de objetos y modelo relacional. Ahora el esquema de
datos del dominio viene representado por la implementación que se realice del
diagrama de clases.
● Se consigue evitar el problema del Object-Relational Impedance Mismatch sin
sacrificar el rendimiento que los mapeadores objeto-relacionales sufren
actualmente para llevar a cabo el mismo objetivo.
La mayor clave del éxito que está teniendo este motor de base de datos frente a otros
competidores que han desarrollado tecnologías similares, es que se ha optado por un
modelo de licenciamiento idéntico al utilizado por empresas como MySQL: licencia dual
GPL/comercial. Es decir, si se quiere desarrollar software libre con esta librería, su uso no
conlleva ningún coste por licencia; sin embargo si se desea aplicar a un software
privativo, se aplica otro modelo de licenciamiento concreto.
Actualmente este producto funciona como una librería para dos tipos de plataformas de
desarrollo: Java y.NET (tanto la implementación de Microsoft como la de Mono).
Fuente: Wikipedia
Link: http://es.wikipedia.org/wiki/Db4o
Caracteristicas.
● DB orientada a objetos 100%.
● Puede mapearse relacionalmente.
● Licencia GPL para proyectos libres.
● Licencia Comercial para proyectos comerciales.
● ACID Test.
● Disponible para java y .net/mono.
Persistir.
● Todas las operaciones sobre la base de datos se hace a través de una instancia de
"ObjectContainer".
● Se obtiene de la siguiente manera.
● Hay que tener cuidado que si un objeto contiene a otro (en este caso tito conoce a fiat)
es importante primero guardar el contenido y luego el contenedor (primero el auto y
después la persona); ya que sino al guardar tito tito guardara automáticamente su propia
instancia de auto diferente a la que esta en fiat.
Recuperando Datos.
Query by Example.
● Es el mecanismo mas sencillo, consiste en crear una instancia con los datos que uno
quiere buscar y dejando sus valores por defecto en los que no les interesa el valor que
contenga.
● Ejemplo:
Persona filtro = new Persona(null, null, fiat); //las personas que poseean
// esa instancia de auto.
filtro = new Persona("tito", null, null); // las personas que se llamen
"tito"
ObjectSet<Persona> os = oc.queryByExample(filtro); //realizamos la query
while(os.hasNext()){ // mientras hayan resultados
Persona p = os.next(); // extraemos la siguiente persona
System.out.println(p); // imprimimos la persona por parametro
}
○ Existen otras desventajas pero estas dos evidencian los problemas principales de
QbE.
SODA.
● Es el mas complejo de los mecanismos.
● Es de bajo nivel.
● Es útil para situaciones donde QbE es muy estricto.
● Solo esta disponible por motivos de retrocompatibilidad.
● No sera abordado y puede consultarse el manual de referencia de db4O para mas
información.
Native Queries.
ObjectSet<Persona> os = oc.query(
new Predicate<Persona>(){
@Override
public boolean match(Persona p) {
return p.getName.startsWith("ti");
}
});
Update.
● Solo consiste en obtener un objeto ya almacenado, modificarlo y volverlo a guardar.
● ejemplo:
ObjectSet<Persona> os = oc.query(
new Predicate<Persona>(){
@Override
public boolean match(Persona p) {
return p.getName.startsWith("ti");
}
});
Persona primero = os.get(0); // obtenemos la primer persona del resultado
primero.setName("toto"); // cambiamos el nombre
oc.store(primero);
Delete.
● Solo consiste en obtener un objeto ya almacenado, y borrarlo con el método
"delete(obj)" del ObjectContainer.
● ejemplo:
ObjectSet<Persona> os = oc.query(
new Predicate<Persona>(){
@Override
public boolean match(Persona p) {
return p.getName.startsWith("ti");
}
});
Persona primero = os.get(0); // obtenemos la primer persona del resultado
oc.delete(primero); // se borra primero
Transacciones.
Commit.
● Es homólogo a las RDBMS, confirma todos los cambios hasta el momento como
permanentes en la base de datos.
● El metodo "close()" de "ObjectContainer" tambien es un commit.
Rollback.
Ejemplo:
ObjectSet<Persona> os = oc.query(
new Predicate<Persona>(){
@Override
public boolean match(Persona p) {
return p.getName.startsWith("ti");
}
});
Persona primero = os.get(0);
primero.setName("toto");
oc.store(primero);
oc.commit(); // confirmamos el cambio de nombre
primero.setName("Paco buen gesto"); //volvemos a cambiar el nombre
oc.store(primero);
oc.rollback(); // volvemos a dejar el nombre como "toto"
// cabe aclarar que en este momento primero (que esta en memoria)
// aun mantiene el nombre "Paco buen gesto" y hay que
// actualizarlo.
db.ext().refresh(primero, Integer.MAX_VALUE); //max value indica que sea al
// ultimo commit de su historial
primero.setName("Amilcar Soncillo"); // cambiamos el nombre una vez mas
oc.close(); // se confirma Amilcar Soncillo como nombre
Profundidad.
● Cuando se hacen búsquedas y actualizaciones puede que los resultados vengan en null.
Como cuando se almacena una coleccion(ArrayList, LinkedList, Hash...) en un objeto.
● Esto se debe al nivel de profundidad en la activación (instanciación interna en el árbol de
objetos) que hace db4o al sacar un objeto de la base para optimizar recursos.
● En el caso de las colecciones es que heredan de muchos tipos e implementan bastantes
interfaces por lo que el árbol de objetos se vuelve más profundo de lo esperado y el nivel
de activación de db4o por omisión (que es de 5 niveles) no cubre a esos nodos, por lo
que hay que configurar la base para que active a esos nodos al momento de realizar una
consulta. Esta configuración se realiza de la siguiente forma:
Db4oFactory.Configure().ObjectClass(TuTipodeObjeto.Class).UpdateDepth(20);
Db4oFactory.Configure().ObjectClass(TuTipodeObjeto.Class).CascadeOnActivate(tru
e);
Db4oFactory.Configure().ObjectClass(TuTipodeObjeto.Class).CascadeOnUpdate(true)
;
Db4oFactory.Configure().ObjectClass(TuTipodeObjeto.Class).CascadeOnDelete(true)
;