Vous êtes sur la page 1sur 35

C AM AC H O L I N E TH C AS TI L L O G O N Z AL O FE R N AN D E Z M AR C O S FU E N TE S G E R B E R

db4o
Bases de datos orientadas a objetos
22 de diciembre de 2007

Introduccin
En este artculo
1 2 3
Introduccin Descripcin del problema BDOO Descripcin de la instalacin y

A pesar de que las bases de datos relacionales lideran el mercado, las bases de objetos ganan cada vez ms aceptacin. Las bases de datos relacionales son ideales para aplicaciones tradicionales que soportan tareas administrativas. Sin embargo, como resultado de los avances en hardware y software, han surgido aplicaciones ms sofisticadas. Aplicaciones de ingeniera (CAD), aplicaciones CASE, sistemas multimedia, sistemas de informacin geogrfica (GIS) y medica, aplicaciones 3D y sistemas inteligentes, aplicaciones de bioinformtica, telecomunicaciones y robtica, entre otras cosas, pueden caracterizarse por estar compuestas de objetos complejos relacionadas entre s de forma compleja. Las bases de datos orientadas a objetos se crearon para tratar de satisfacer las necesidades de estas nuevas aplicaciones. La orientacin a objetos ofrece flexibilidad para manejar algunos de estos requisitos y no est limitada por los tipos de datos y los lenguajes de consulta de los sistemas de bases de datos tradicionales. Una caracterstica clave de las bases de datos orientadas a objetos es la potencia que proporcionan al diseador al permitirle especificar tanto la estructura de objetos complejos, como las operaciones que se pueden aplicar sobre dichos objetos. Las bases de datos orientadas a objetos (BDOO) estn orientados a objetos

configuracin del gestor

4 5

Creacin de una Base de datos pequea Implementacin de consultas y anlisis de

rendimientos

Comparacin de rendimientos con otras

bases de datos

7 8

Conclusiones Referencias bibliogrficas

Un sistema de gestin de base de datos de objetos (ODBMS, conocida tambin como sistema de gestin de base de datos orientada a objetos OODBMS), es un sistema de gestin de base de datos (DBMS) que soporta la modelacin y la creacin de datos como objetos. Esto incluye soporte adicional para las clases de los objetos, la herencia de propiedades y mtodos de sus subclases y objetos.

y almacenan y recuperan objetos en los que se almacena estado y comportamiento. Las clases utilizadas en un determinado lenguaje de programacin orientado a objetos son las mismas clases que sern utilizadas en una BDOO; de tal manera, que no es necesaria una transformacin del modelo de objetos para ser utilizado por un SGBDOO. De forma contraria, el modelo relacional requiere abstraerse lo suficiente como para adaptar los objetos del mundo real a tablas. En la siguiente figura podemos apreciar los componentes que conforman una base de datos orientada a objetos que son los sistemas orientado a objetos y los sistemas de bases de datos.

PGINA 2

BASES DE DATOS ORIENTADAS A OBJETOS

Descripcin del problema BDOO


Antes que fuera desarrollado el primer DBMS, los programas accedan a datos de archivos planos. Estos no permitan representar la relacin lgica de los datos o garantizar la integridad de los mismos. El modelamiento de datos fue desarrollado en posteriores generaciones para proveer a las aplicaciones de mayores caractersticas de almacenamiento de datos. Los modelos de datos se desarrollaron en tres generaciones. La primera generacin de modelos de datos tiene a permanecer y esta aun lejos de marcharse. Aun ms, muchas de las compaas tienen inversiones significativas en bases de datos o poseen dependencias crticas de estas. Incluso algunos productos de la primera generacin son aun usados y soportados por sus proveedores. Hasta el momento, las bases de datos comerciales de mayor xito, son aquellos que usan el modelo relacional el cual es considerado como la segunda generacin. Las bases de datos relaciones definitivamente tienden a no desaparecer y estas dominan el mercado.
Figura 1 Diseo de Base de Datos

Primera generacin Con el surgimiento de los sistemas de computadoras en 1960 tambin se desarrollo los modelos de datos jerrquico y de red, los cuales son usualmente referidos como modelos de datos de primera generacin. El modelo de datos jerrquico muestra la representacin de la informacin en forma de jerarquas y es el preferido por muchos usuarios. Este representa directorios y archivos como un sistema de arboles. El estndar del modelo de datos en red fue desarrollado por la CODASYL, la misma organizacin encargada del desarrollo de COBOL, este modelo adiciona una importante caracterstica para el modelamiento de datos que es la mltiple ascendencia, esto significa que una simple entidad puede tener muchas relaciones lo que permiti que la modelacin de datos sea ms real en muchos escenarios. Segunda generacin El modelo relacional es indiscutiblemente la ms exitosa, usada y difundida
Figura 2 Evolucin e historia de las bases de datos

forma hasta la fecha de modelamiento de datos. Esta caracterstica es realmente diferente a los modelos anteriores. Para empezar, las entidades de datos son representados por estructuras simples tabulares, conocidas como relaciones. La relacin de entidades y la integridad de datos son definidas como llaves primarias y llaves forneas. El diseo de una base de datos relacional es basado en la idea de la normalizacin y el proceso de remover datos redundantes de tablas con el fin de mejorar la eficiencia en el almacenamiento, integridad y escalabilidad. Tercera generacin Los modelos de tercera generacin, fueron propuestos en 1980 y son la respuesta a problemas que a menudo surgen de la unin de un sistema orientado a objetos y base de datos relacional. Estas son descritas a menudo como post relacionales, aunque es ms realista considerar como coexistentes del modelo relacional y proveen opciones adicionales para los desarrolladores. A diferencia de la segunda generacin donde el modelo sss

BASES DE DATOS ORIENTADAS A OBJETOS


relacional fue universalmente a adoptado objetos de con algunas

PGINA 3
variaciones

propietarias, los orientados

tercera

generacin han

evolucionado en dos diferentes direcciones. El modelo de datos orientado a objetos es similar al paradigma orientado a objetos, excepto que los objetos son persistentes, es decir, que ellos continan existiendo despus que la ejecucin del programa ha concluido y los objetos en una base de objetos se almacena exactamente como ellos fueron creados en la aplicacin. El modelo Objeto Relacional, trata de resolver de diferentes ngulos el problema de almacenamiento de objetos en base de datos. Extiende capacidades del modelo relacional para permitir que los objetos sean almacenados en columnas de una base de datos relacional. Este modelo es a menudo referido como un DBMS hibrido. Bases de datos orientadas a objetos Cuando las capacidades de bases de datos se integran con la tecnologa de objetos el resultado es una base de objetos. A diferencia de los RDBMS estas bases permiten que sus permiten que sus elementos se accedan como objetos propios de un entorno de programacin basado en objetos.
Figura 3 Manifiesto de Bases de datos orientadas a objetos

Permite tambin, una representacin ms directa y la modelacin de problemas del mundo real a travs de la construccin orientada a objetos, el usuario puede disimular los detalles de implementacin de sus mdulos, objetos referenciales, y extensin de sistemas a travs de especializacin en mdulos existentes. En la figura se ilustra cmo se combinan los conceptos de tecnologa de objetos y bases de datos para conformar una base de objetos.

Figura 4 Representacin de los datos como objetos

Caractersticas de las bases de datos orientadas a objetos


Las bases de objetos no solo permiten trabajar transparentemente con un entorno de programacin basado en objetos sino que soportan todos los

PGINA 4

BASES DE DATOS ORIENTADAS A OBJETOS

1. 2.

Agregacin.- Objetos que estn compuestos por otros objetos. Encapsulamiento.Almacenamiento de atributos junto con mtodos. No todas las bases soportan mtodos pero se apoyan en las bases definidas en los esquemas para reconstruir el objeto con sus mtodos.

3. 4.

Herencia.- Los objetos heredan atributos y comportamiento de sus objetos padre. Polimorfismo.- Permite a los objetos responder de forma distinta a un mensaje.

La mayora de estas bases de datos tienen la capacidad de procesamiento transaccional que soporta concurrencia. El procesamiento transacciones asegura que se realice la transaccin completamente o, en caso contrario, ninguna. Las transacciones soportan concurrencia y recuperacin de datos. Una falla causa un roll-back de datos. En lo que respecta a la concurrencia las bases de objetos verifican en qu momento permiten el acceso en paralelo a los datos. Este acceso concurrente implica que ms de una aplicacin o hilo podran estar actualizando o leyendo los mismos objetos a la vez. Esto suele denominarse commit en dos fases. Para ello se utiliza normalmente bloqueo de datos para lecturas y escrituras. Db4o El motor de base de objetos db40 permite cubrir (y exceder) las caracteristicas de las bases de datos orientados a objetos.
Db4o tiene un simple trabajo

Este motor de base de datos presenta las siguientes caractersticas: Consumo mnimo de recursos: Db4o est diseado para ser embebido en clientes u otros componentes de software, de manera totalmente invisible para el usuario final. Es por eso que viene como una librera fcil de incorporar, con un tamao que ronda los 400 Kb. Como el motor corre en el mismo proceso de la aplicacin, el usuario cuenta con control completo sobre la administracin de memoria, y puede realizar procesos de profiling y debugging del desempeo sobre todo el sistema. Si la aplicacin est corriendo, la base tambin lo est, sin excepcin. Y an ms importante, db4o es extremadamente flexible a la hora de actualizar una base existente con un modelo de objetos que ha cambiado. Siempre asume que no hay un administrador de base de datos y, por lo tanto, permite a la aplicacin cambiar del modelo viejo al modelo nuevo de modo transparente. Alto rendimiento: El rendimiento de db4o es equiparable al de los mejores sistemas de bases de datos tradicionales. Fcil implementacin: Slo hay que agregar la librera nica de db4o (.jar o .dll) al entorno de desarrollo, abrir el archivo de base de datos y almacenar cualquier objeto (sin importar su complejidad) con una sola lnea de cdigo. Portabilidad: Pocas bases de datos embebibles corren de manera nativa en tantas plataformas orientadas a objetos como db4o. sta permite desarrollar aplicaciones para desplegar en varias plataformas (por ejemplo, en PDAs) o en combinaciones heterogneas de clientes Windows y servidores Java.

que hacer. Se trata de una base de datos que est especficamente diseado para proporcionar persistencia a los programas desarrollados orientados a objetos. Persistencia de objetos es la capacidad de guardar los objetos en un sistema a fin de que existan incluso despus de que la aplicacin que los cre deje de usarlos

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 5

Confiabilidad: Finalmente, db4o soporta todas las caractersticas ACID. Mltiples usuarios simultneos de una base db4o son efectivamente aislados, y sus operaciones son serializadas de forma transparente por la librera. Las transacciones se terminan con los mtodos commit() y rollback() de la clase ObjectContainer. Y en caso de que el sistema se caiga durante una actualizacin de la base de datos, cuando el ObjectContainer de db4o es reabierto, se completan de forma correcta todas las transacciones interrumpidas. ObjectDB ObjectDB para Java es un potente sistema de gestin de base de datos de objetos (ODBMS) escrita completamente en Java. unos pocos cientos de KBs a GBs. Puede manejar
Figura 5 Db4o guarda objetos como objetos y no como tablas.

eficientemente una amplia gama de base de datos de tamaos, desde Tiene una pequea planta, de alto rendimiento, y una arquitectura flexible (Tier-1, 2-Tier o N-Tier). Esta base de datos presenta las siguientes caractersticas: ObjectDB es una base de datos de objetos: El desarrollo de aplicaciones orientadas a objetos con ObjectDB es ms fcil y mucho ms eficaz debido a que el contenido de la base de datos de objetos de aplicacin. Considerando que, trabajando con una base de datos relacional de Sistemas de Gestin (RDBMS) es difcil, ya que los desarrolladores deben hacer frente a las tablas, registros y SQL adems de la aplicacin de las clases y objetos. ObjectDB es compatible con JDO: ObjectDB es compatible con el JDO (Java Data Objects) estndar, desarrollado por Sun. Por lo tanto, las
Figura 6 Interface Object Manager de db4o

aplicaciones que utilicen ObjectDB no estn vinculadas a ObjectDB. ObjectDB es Fcil de Usar: Puede ser productivo con ObjectDB en muy poco tiempo, porque es muy fcil de usar. De hecho, es la ms fcil El uso de estos aplicacin de JDO. La mayora de las otras implementaciones JDO mapeo de clases y objetos a tablas y registros en un RDBMS. mapeos hace posible escribir cdigo Java limpio, pero todava requiere cierta familiaridad con la base de datos relacional y de los conceptos de las tablas y columnas para una aplicacin definida, a fin de realizar las asignaciones necesarias y mantener durante toda la vida de un sistema. Con ObjectDB, puede olvidar las bases de datos relacionales, tablas, registros, campos, SQL, JDBC y conductores, y centrar su atencin en la aplicacin de clases de Java exclusivamente. ObjectDB es muy porttil: ObjectDB est totalmente escrita en Java. Por lo tanto, puede ejecutarse en cualquier entorno que soporte Java. ObjectDB es muy rpido: ObjectDB tiene muy buen rendimiento. Puede almacenar y recuperar miles de objetos por segundo. Incluso las preguntas que millones de objetos son muy rpidas, cuando se definen los ndices adecuados. ObjectDB tiene una base de datos Explorer: La base de datos de explorador ObjectDB, que se ofrece con cada producto ObjectDB, es una sofisticada herramienta que permite la navegacin, consulta, edicin y la construccin de objetos Java en una base de datos, visualmente, sin escribir una sola lnea de cdigo.

PGINA 6
lnea de cdigo. En el mundo del software libre y con licencia existen las siguientes bases de datos orientadas a objetos adems de las que vimos anteriormente: Gemstone Systems GemStone Facets 32 bit for Linux Intersystems Cach Post-relational Database Progress Software ObjectStore PSE Pro for java or C++ Objectivity - Objectivity/DB Versant - Versants ODBMSs Entre otras bases de datos, como tambin existen los frameworks de persistencia que manejan el modelo objeto relacional como Hibernate, Spring, JavaDB (Derby de Apache).

BASES DE DATOS ORIENTADAS A OBJETOS

Descripcin de la instalacin y Configuracin de la BD


Instalacin
La instalacin es muy simple. Solo se debe adicionar el path que contiene los archivos db40-*.jar al CLASSPATH o copiar en el directorio /lib/ de Eclipse o adicionar como librera a su proyecto en jDeveloper. El motor de la base de datos consiste tan solo en un pequeo archivo .jar de menos de 400kb. La instalacin supone agregar el motor de la base de datos (db4o-.jar) a nuestro CLASSPATH. La documentacin de la base de datos est creada mediante JavaDoc y viene incluida en el mismo paquete.

Modos de configuracin del Motor de base de datos


Modo embebido Un nico thread que abre el archivo de datos de la OODBMS y que hace las operaciones de E/S. Modo servidor Usa el protocolo TCP/IP. Las conexiones se realizan a un servidor de objetos ejecutado en otra mquina virtual. Por cada una de estas conexiones el servidor lanza un thread.
Figura 5 Clientes conectndose a un servidor db4o.

Modo servidor embebido El servidor y los clientes viven dentro de la misma mquina virtual. Especial para aplicaciones que son multihilo pues cada hilo podra abrir una o ms conexiones
Figura 6 Db4o embebido, de redes y fuera de banda.

Almacenamiento de la informacin
Un nico archivo de datos: Arquitectura de ndices B-Tree ndices por clase. ndices por campo (similar a lo que es indexar una tabla en un RDBMS).

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 7

Marshaller de objetos Guarda de manera inteligente los objetos padres y sus colecciones dentro del archivo. Para ello, usa como estrategia un agrupamiento adecuado para mejorar la E/S.

Tipos de consultas
Query by Example (QBE): Consultas por ejemplo o prototipo. Obtiene una coleccin de objetos a partir de una instancia inicial de la clase en cuestin. Simple Object Database Access (SODA): Consultas
Figura 7
Mtodos estticos nos permiten: - Abrir y Cerrar db. - Conectarnos a servidor. - Configurar la db. Com.db40 La interfase ms importante: - Es nuestra propia dB ya sean en single o client mode.

Com.db40. Db4o

com.db40. ObjectContainer

dinmicas basadas en nodos. Obtiene una coleccin de objetos a partir de un grafo inicial, al que se le impone ciertas restricciones para la seleccin de objetos mientras es recorrido. Native Queries (NQ): Consultas a datos con lenguaje nativo. Es una consulta expresada completamente en el lenguaje de programacin que se est usando en la aplicacin. o Con todo lo que supone esto (TypeSafe, No-Strings, No Learn)
com.db40.ext Com.db40.config com.db40.query com.db40 Paquete que contiene tipos y clases que nos permiten configurar y/o tunear la base de datos. La configuracin se hace por norma general antes de abrir la sesin de las mismas

APIs de la base de datos

Configuracin general
Para configurar la base de datos se debe explicar los APIs siguientes de la librera: com.db4o.ObjectContainer. Puede ser una BD tanto en single-mode como en client to server connection. Todos los ObjectContainer manejan una transaccin. Todo trabajo es transaccional. Cada ObjectContainer mantiene sus propias referencias a objetos almacenados e instanciados. Un ObjectContainer est diseado para permanecer abierto mientras se trabaja con ellos, cuando cerramos una dB todas las referencias a objetos desaparecen de la memoria RAM. La configuracin de Db4o reside en el paquete db40.config Las configuraciones ms importantes son: Configuracin cliente/Servidor Configuracin para las Clases y campos especficos. Configuracin de la interface Configuracin del tunning de la base de datos.
Figura 10 La configuracin especfica cliente/servidor reside en la interfase ClientServerConfiguration
ClientServerConfiguration configuration = Db4o.newConfiguration().clientServer();

La configuracin de Db4o reside en el paquete db40.config.


Figura 8

//se obtiene la configuracin Configuration configuration = Db4o.newConfiguration(); //Para aplicar la configuracion a ObjectContainer/Client/Server Db4o.openFile(configuration, databaseFileName) Db4o.openServer(configuration, databaseFileName, port) Db4o.openClient(configuration, hostName, port, user, password)

Figura 9 Ejemplo

de uso de la configuracin

Las configuraciones hechas no estn almacenadas en los archivos de la base de datos. Se tiene que pasar la configuracin cada vez que se abre un ObjectContainer/Client/Server. Para usar db4o en modo cliente/servidor es recomendable usar la misma configuracin en el servidor y en el cliente. Para configurar esto apropiadamente ser necesario crear una clase aplicacin con un mtodo que devuelva la configuracin requerida y despliegue esta clase en ambos lados: al servidor y a todos los clientes.

PGINA 8
La configuracin especfica cliente/servidor reside en la interface ClientServerConfiguration. ClientServerConfiguration configuration = Db4o.newConfiguration().clientServer(); Para versiones anteriores a 6.0 no se tiene este mtodo, sin embargo se pueden usar: Configuracin global db40, con las desventajas que se aplican a todos los contenedores de objetos en el corriente VM/runtime y que esta configuracin no puede ser reseteada. Configuracin de la instancia del contenedor de objetos. Las desventajas son que la configuracin no puede ser creada antes de que contenedor sea abierto. Algunos mtodos de configuracin se afectan la manera en que el sistema trabaja en la apertura del contenedor por consiguiente no influyen sobre el contenedor abierto. Algunos mtodos de configuracin se afectan la creacin de la base de datos. La configuracin necesitar ser repetida tantas veces como el nuevo contenedor sea abierto.

BASES DE DATOS ORIENTADAS A OBJETOS

public class Tablassr1 { private String campo1; private String texto; private double numero; private Calendar fecha; . }

Figura 11 Clase Tablassr1.

public class Tablamedidas { private String pruebas; //numero de grupo de prueba (son 7 ) private String nombre; //nombre del proceso de la prueba: insecion, borrado, actualizacion y consulta private Calendar fechaInicio; //fecha en que se hizo el proceso private double cantidadSegundos; //cantidad en milisegundos que tardo la operacion . }
Figura 12 Clase Tablamedidas.

public class Util { public final static DB4OFILENAME="base_proyecto.db4o"; }

String

Creacin de una base de datos pequea


Para ejemplificar como crear una base de datos orientada a objetos se desarrollo una pequea aplicacin cuyo cdigo se encuentra en el anexo Cdigo fuente base de datos pequea. Esta aplicacin solo es de demostracin por lo que es muy simple.

Figura 13 Clase Util.

Tablassr1 tablasrl = new Tablassr1(); tablasrl.set_Tablassr1("" + indice++, textoIn, numeroIn, fechaIn); db.set(tablasrl);

Figura 14 Almacenamiento de un Instancia en la BD.

updateTablassr1(db, "-100");

La base de datos almacena la siguiente estructura de clases:

public static void updateTablassr1(ObjectContainer db, String valorCampo1) { Tablassr1 templeta = new Tablassr1(); templeta.setCampo1(valorCampo1); ObjectSet result = db.get(templeta); Tablassr1 found = (Tablassr1)result.next(); found.setTexto("modificado"); db.set(found); }

Figura 15 Actualizacin de un Instancia en la BD.

consultaCampo1_QBE(db, "-100"); public static void consultaCampo1_QBE(ObjectContainer db, String campo1) { Query carquery = db.query(); carquery.constrain(Tablassr1.class); carquery.descend("campo1").constrain(campo1); ObjectSet result = carquery.execute(); Util.listResult(result); }

Figura 16 Consulta QBE de un Instancia en la BD.

consultaCampo1_SODA(db, "-100"); public static void consultaCampo1_SODA(ObjectContainer db, String campo1) { Query carquery = db.query(); carquery.constrain(Tablassr1.class); carquery.descend("campo1").constrain(campo1); ObjectSet result = carquery.execute(); Util.listResult(result); }

Figura 17 Consulta SODA de un Instancia en la BD.

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 9

Implementacin de consultas y anlisis de rendimientos


Para verificar como la base de datos db4o trabaja se pens en llevar un control del tiempo de respuesta en operaciones Insercin, actualizacin, borrado y consultas de dos clases que se almacenan en la base de datos y otras clases que hacen las operaciones de apertura de la base de datos y las operaciones sobre las clases persistentes: La clase Tablassr1 en la cual insertamos, actualizamos, consultamos y borramos datos: La clase Tablamedidas que guarda los resultados de las operaciones anteriormente hechas a la clase Tablassr1. La clase Util tiene datos como el nombre de la base de datos y utilitarios para listar los objetos de la base de datos, recuperar todos los objetos de una clase genrica y borrar todos los objetos de una clase genrica. La clase principal es PruebaBDOO que realiza las operaciones y registra los resultados en la clase Tablamedidas utilizando cuatro bucles: uno principal de siete repeticiones, y los otros tres bucles de diez repeticiones. Las operaciones que registra son: Insercin de objetos en la base de datos. Donde ndice es el nombre del grupo de repeticin principal que es hasta siete. Un texto, un numero y una fecha son los datos que se almacena en el objeto. Actualizacin de un atributo de un objeto de la base de datos. El cdigo fuente siguiente actualiza el atributo texto de la instancia -100 del objeto Tablassr1. Consulta QBE de un objeto de la base de datos. El cdigo fuente siguiente recupera la instancia -100 del objeto Tablassr1 usando el tipo de consulta QBE. Para ello se le pasa el valor del campo1 de la instancia que queremos recuperar. Consulta SODA de un objeto de la base de datos. El cdigo fuente siguiente recupera la instancia -100 del objeto Tablassr1 usando el tipo de consulta SODA. Consulta NATIVE de un objeto de la base de datos. El cdigo fuente siguiente recupera la instancia -100 del objeto Tablassr1 usando el tipo de consulta NATIVE. El promedio dio como resultado lo siguiente:

consultaCampo1_NATIVE(db, "-100"); public static void consultaCampo1_NATIVE(ObjectContainer db, String campo1) { final String campo1a = campo1; ObjectSet results = db.query(new Predicate() { public boolean match(Tablassr1 tablasr1) { return tablasr1.getCampo1().equals(campo1a); } }); Util.listResult(results); }

Figura 18 Consulta NATIVE de un Instancia en la BD.

Consulta dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA

Total 622 78 95

Promedio 88.86 11.14 13.57

PGINA 10

BASES DE DATOS ORIENTADAS A OBJETOS

Los resultados muestran que las consultas NATIVE tardan en promedio 88.86 milisegundos, QBE 11.14 y SODA 13.57. Se aprecia que en consultas QBE es ms veloz que las otros dos tipos de consulta. (El cdigo fuente que utilizamos para estas pruebas se encuentran en el anexo cdigo fuente db4o)

Resultados obtenidos de la prueba de operaciones a la base de datos


Bluque proceso 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto dif_borrartodos dif_consulta_NATIVE dif_consulta_QBE dif_consulta_SODA dif_crear dif_modtexto Cantidad milisegundos 172.0 187.0 62.0 16.0 374.0 63.0 94.0 93.0 16.0 0.0 109.0 31.0 31.0 78.0 0.0 15.0 109.0 16.0 94.0 62.0 0.0 16.0 94.0 31.0 47.0 94.0 0.0 16.0 93.0 0.0 94.0 62.0 0.0 16.0 78.0 15.0 32.0 46.0 0.0 16.0 93.0 16.0

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 11

Comparacin de rendimientos con otras bases de datos


Comparacin entre db4o, Oracle, SqlServer
Para realizar la comparacin utilizamos un algoritmo que para medir el tiempo de creacin, modificacin y eliminacin de registros de tipo carcter, fecha y numrico. Tambin las pruebas se realizaron en una computadora con las siguientes caractersticas: Intel Core2 Duo T7100 @ 1,80Ghz cach de nivel 2 de 2 MB a 4 MB DDR II 1 Gb de memoria 2 ranuras SODIMM que admiten memoria de doble canal Unidad de disco duro ATA de 120 GB (5.400 rpm) Sistema Operativo Windows XP

Los algoritmos utilizados para estas pruebas se encuentran en los anexos para los tres gestores de bases de datos. Obtuvimos los siguientes resultados:

Figura 19 Algoritmo para la comparacin, este se lo ejecuta 7 veces para la prueba.

Se puede apreciar que el gestor de base de datos Oracle es el ms rpido en la creacin de los registros, siguiendo en orden se encuentra el gestor db4o con una diferencia pequea con el primero, posteriormente se encuentra SqlServer con tiempos bastante altos en comparacin con los dos anteriores.

PGINA 12

BASES DE DATOS ORIENTADAS A OBJETOS


En el anterior grfico podemos observar que el gestor ms rpido para la modificacin de datos es db4o, continuando Oracle y posteriormente SqlServer.

Para el borrado de datos se puede apreciar que el ms rpido es SqlServer, posteriormente casi similares se encuentran db4o y Oracle respectivamente.

Comparacin entre bases de datos orientadas a objetos


La organizacin Polepos realiz un benchmark entre bases de datos orientadas a objetos como tambin frameworks de persistencia, entre los cuales se encuentran en esta prueba: Db4o Hibernate MySql Mckoi JavaDB HSQLDB SQLite La prueba consiste en escritura, seleccin por ndice, modificacin y borrado de un simple objeto individualmente. En las siguientes tablas y figuras se presentan los resultados de la prueba:

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 13

PGINA 14

BASES DE DATOS ORIENTADAS A OBJETOS

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 15

PGINA 16

BASES DE DATOS ORIENTADAS A OBJETOS

Segn los autores de estas pruebas no existe un gestor que se destaque de los dems. Es por eso que llegan a las siguientes conclusiones: HSQLDB presenta mejores rendimientos en varios grficos, esto se debe a que la mayora de las transacciones se la realiza en la memoria, pero no se sabe a ciencia cierta si todo el mecanismo de este gestor cumple con los principios ACID. El uso de la tecnologa ORM tiene un fuerte impacto negativo en el rendimiento. Pero esto se puede compensar con hardware, por otro lado la tecnologa ORM utiliza mucho el cache y a eso se debe su rendimiento pero es muy riesgoso en aplicaciones multiusuario. Como era de esperar db4o presenta un mejor rendimiento en herencias jerrquicas y en estructuras de rbol. Para bases de datos relacionales se recomienda MySql ya que es muy limitado y sirve para aplicaciones pequeas. SQLite presento un problema en las pruebas que realizaron ya que el controlador JDBC no era compatible en modo batch y tuvieron que utilizar autocommit, lo cual se presume que afecto al rendimiento de este mismo. Todas las tecnologas utilizadas se parecen mucho en el almacenamiento y la tendencia de orientado a objetos tratar en un fututo eliminar el SQL, eso aseveran los autores de este benchmark.

Conclusiones
En este trabajo pudimos introducirnos ms a los conceptos de bases de datos y con ms nfasis al manifiesto de orientado a objetos. Tambin pudimos ver que el gestor de base de datos db4o sigue el mismo camino que otras bases de datos al cumplir con los estndares ODMG (Object Data Management Group) esto quiere decir que este gestor permite la seleccin y manipulacin de los objetos. Tambin este gestor presenta una relacin estrecha con los lenguajes de programacin orientada a objetos ms populares como Java y .NET Vimos los conceptos fundamentales sobre los objetos forman parte

fundamental de los OODBMS, que sustenta la representacin bsica de las entidades, tambin aprendimos a manipular y tratar con bases de datos de objetos tales como la capacidad de rendimiento que tienen estos gestores. Realizamos comparaciones de rendimientos entre db4o, gestores relacionales y gestores orientadas a objetos y vimos que este gestor es bastante robusto para usarlo para el desarrollo de aplicaciones.

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 17

Referencias
http://www.objectdb.com/ http://www.db4o.com/espanol/ http://www.odbms.org/

http://www.polepos.org
S. Edlich, J. Paterson et. al., The Definitive Guide to db4o, Apress, 2006 D. Barry, The Object Database Handbook: How to Select, Implement, and Use Object-Oriented Databases, John Wiley & Sons, 1996 R. Cattell, D. Barry, D. Jordan, C. Russell, et al. (Editors), The Object Data Standard ODMG 3.0, Morgan Kaufmann, 2000 A. Chaudri, M. Loomis, Object Databases in Practice, Prentice-Hall, 1997

PGINA 18

BASES DE DATOS ORIENTADAS A OBJETOS

Anexos - Cdigo fuente Base de datos pequea


package bd_small; public class Empleado { protected String nombreEmpleado; protected int nroItem; protected float sueldoBase; protected Area area; public Empleado(){ } public Empleado(String nombreEmpleado, int nroItem, float sueldoBase){ this.nombreEmpleado = nombreEmpleado; this.nroItem = nroItem; this.sueldoBase = sueldoBase; } public void setnombreEmpleado(String n){this.nombreEmpleado = n;} public String getnombreEmpleado(){return this.nombreEmpleado;} public void setnroItem(int s){this.nroItem = s;} public int getnroItem(){return this.nroItem;} public void setsueldoBase(final float b){this.sueldoBase = b;} public float getsueldoBase(){return this.sueldoBase;} public void setArea(Area t) {this.area = t;} public Area getArea() {return this.area;} public String toString() { return nombreEmpleado + ":" + sueldoBase; } } package bd_small; import java.util.List; import java.util.ArrayList; public class Area { private String nombre; private String direccion; private int categoria; private int codigoPresupuesto; private List empleados; public Area(String nombre, String direccion, int categoria, int codigoPresupuesto){ this.nombre = nombre; this.direccion = direccion; this.categoria = categoria; this.codigoPresupuesto = codigoPresupuesto; this.empleados = new ArrayList(); } public void addEmpleado(Empleado p) { empleados.add(p); } public void setNombre(String n){this.nombre = n;} public String getNombre(){return this.nombre;} public void setDireccion(String c){this.direccion = c;} public String getCity(){return this.direccion;} public void setEmpleados(List p){empleados = p;} public List getEmpleados(){return empleados;} public void setCategoria(int w) {this.categoria = w;} public int getCategoria(){return this.categoria;}

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 19

public void setCodigoPresupuesto(int l) {this.codigoPresupuesto = l;} public int getCodigoPresupuesto() {return this.codigoPresupuesto;} public String toString() { return nombre; } }

package bd_small; public class JefeArea extends Empleado{ private int nroCargo; public JefeArea(String nombre, int nroItem, float sueldoBase,int nroCargo) { super(nombre,nroItem,sueldoBase); this.nroCargo = nroCargo; } public void setCargo(final int w){this.nroCargo = w;} public int getnroCargo() {return this.nroCargo;} public String toString() { return nombreEmpleado + ":" + sueldoBase + ", " + nroCargo; } } package bd_small; import com.db4o.*; import com .db4o.query.*; import java.io.File; import java.util.List; import java.util.ArrayList; import java.util.Iterator; public class Db4oTest { private String filename;

public Db4oTest() { filename = "c:\\teamsdemo.yap"; } public static void main(String[] args){ Db4oTest tester = new Db4oTest(); System.out.println("createTestData"); tester.createTestData(); System.out.println("-----------------------queryByExampleDemo"); tester.queryByExampleDemo(); System.out.println("-----------------------listAllEmpleados"); tester.listAllEmpleados(); System.out.println("-----------------------updateDemo"); tester.updateDemo(); System.out.println("-----------------------deleteDemo"); tester.deleteDemo(); System.out.println("-----------------------SODAQueryDemo"); tester.SODAQueryDemo(); System.out.println("-----------------------SODASortedQueryDemo"); tester.SODASortedQueryDemo(); System.out.println("-----------------------SODATwoFieldQueryDemo"); tester.SODATwoFieldQueryDemo(); System.out.println("-----------------------SODATwoClassQueryDemo"); tester.SODATwoClassQueryDemo(); }

PGINA 20

BASES DE DATOS ORIENTADAS A OBJETOS

/** * creates test objects and stores them in new database file */ private void createTestData(){ System.out.println("Adicionamos informacion a la base de datos"); // Creamos Empleados Empleado p1 = new Empleado("Barry Bonds", 25, 0.362f); Empleado p2 = new Empleado("Marquis Grissom", 9, 0.279f); Empleado p3 = new Empleado("Ray Durham", 5, 0.282f); Empleado p4 = new Empleado("Adrian Beltre", 29, 0.334f); Empleado p5 = new Empleado("Cesar Izturis", 3, 0.288f); Empleado p6 = new Empleado("Shawn Green", 15, 0.266f); // Creamos JefeArea Empleado p7 = new JefeArea("Kirk Rueter",46, 0.131f, 9); Empleado p8 = new JefeArea("Kazuhisa Ishii",17, 0.127f, 13); // Creamos Areas Area t1 = new Area("Contabilidad", "San Francisco", 91, 71); Area t2 = new Area("Ventas", "Los Angeles", 93, 69); // Add Empleados a Areas t1.addEmpleado(p1); p1.setArea(t1); t1.addEmpleado(p2); p2.setArea(t1); t1.addEmpleado(p3); p3.setArea(t1); t2.addEmpleado(p4); p4.setArea(t2); t2.addEmpleado(p5); p5.setArea(t2); t2.addEmpleado(p6); p6.setArea(t2); // Add JefeArea to Areas t1.addEmpleado(p7); p7.setArea(t1); t2.addEmpleado(p8); p8.setArea(t2); // Open a new database new File(filename).delete(); ObjectContainer db = Db4o.openFile(filename); // Store Areas - also stores associated Empleados db.set(t1); System.out.println("Stored " + t1); db.set(t2); System.out.println("Stored " + t2); // Close database db.close(); } /** * query-by-example */ private void queryByExampleDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Recupera un Empleado mediante un objeto Empleado Empleado exampleEmpleado = new Empleado("Barry Bonds",0,0f); result=db.get(exampleEmpleado); System.out.println(result.size()); while(result.hasNext()) { System.out.println(result.next()); } result.reset();

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 21

// Recupera un Area y todos sus Empleados Area exampleArea = new Area("Dodgers",null, 0, 0); result=db.get(exampleArea); // List results System.out.println(result.size()); while (result.hasNext()){ Area t = (Area) result.next(); System.out.println(t); Iterator itr = t.getEmpleados().iterator(); while (itr.hasNext()) { Empleado p = (Empleado) itr.next(); System.out.println(p); } } // Close database db.close(); } /** * Lista los detalles de todos los empleados */ private void listAllEmpleados(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Recupera todos los Empleados Empleado exampleEmpleado = new Empleado(null,0,0f); result=db.get(exampleEmpleado); // Print results System.out.println(result.size()); while(result.hasNext()) { Empleado p = (Empleado) result.next(); System.out.println(p); } result.reset(); // Close database db.close(); } /** * Actualizacion de un Empleado */ private void updateDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Recupera un Empleado Empleado exampleEmpleado = new Empleado(); exampleEmpleado.setnombreEmpleado("Shawn Green"); result=db.get(exampleEmpleado); Empleado p = (Empleado) result.next(); // assume one result only here // Update and store p.setsueldoBase(0.299f); db.set(p); db.close(); listAllEmpleados(); // Close database }

PGINA 22

BASES DE DATOS ORIENTADAS A OBJETOS

/** * borra un Empleado */ private void deleteDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Retrieve a Empleado by creating an example Empleado object Empleado exampleEmpleado = new Empleado("Ray Durham",0,0f); result=db.get(exampleEmpleado); Empleado p = (Empleado) result.next(); // assume one result only here // Delete db.delete(p); db.close(); listAllEmpleados(); // Close database } /** * Con S.O.D.A. recuperamos todos los Empleados con sueldo base > .300 */ private void SODAQueryDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Creamos query Query q = db.query(); // Constrain query a Empleado q.constrain(Empleado.class); // Descendemos al sueldo base y obtenemos el valor mayor > 0.3 q.descend("sueldoBase").constrain(new Float(0.3f)).greater(); //q.descend("sueldoBase").constrain(new Float(0.2f)).smaller(); // Execute query result = q.execute(); // List results System.out.println(result.size()); while(result.hasNext()) { //System.out.println(result.next()); // Print cada Empleado Empleado p = (Empleado) result.next(); System.out.println(p); // Para cada Empleado tambien se obtiene el Area - se imprime el Area Area t = p.getArea(); System.out.println(t); } result.reset(); // Close database db.close(); }

BASES DE DATOS ORIENTADAS A OBJETOS


private void SODASortedQueryDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Creamos query Query q = db.query(); // Constrain query para Empleado q.constrain(Empleado.class); // Descendemos al atributo sueldoBase y restringimos el valor a > 0.3 q.descend("sueldoBase").orderAscending(); // Execute query result = q.execute(); // List results System.out.println(result.size()); while(result.hasNext()) { System.out.println(result.next()); } result.reset(); // Close database db.close(); } /** * Usando S.O.D.A. recuperamos todos los Empleados con sueldoBase > .130 * Quienes tambien son jefes de Area con > 5 nroCargo */ private void SODATwoFieldQueryDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Creamos query Query q = db.query(); // Constrain query to Empleado objects q.constrain(Empleado.class); // Descendemos al atributo sueldoBase y restringimos el valor a > 0.13 Constraint constr = q.descend("sueldoBase").constrain(new Float(0.13f)).greater(); // Descendemos al atributo nroCargo (tambien seleccionara JefeArea) // y restringimos nroCargo > 9, y conbinamos las dos restricciones q.descend("nroCargo").constrain(new Integer(5)).greater().and(constr);

PGINA 23

// Execute query result = q.execute(); // List results System.out.println(result.size()); while(result.hasNext()) { // Print cada Empleado Empleado p = (Empleado) result.next(); System.out.println(p); // Conseguimos Empleado y el Area donde trabaja Area t = p.getArea(); System.out.println(t); } result.reset(); // Close database db.close(); }

PGINA 24

BASES DE DATOS ORIENTADAS A OBJETOS

/** * Usando S.O.D.A. encontramos todos los Empleados con sueldo base > .300 * quienes tambien trabajan en las areas con nroCargo > 92. */ private void SODATwoClassQueryDemo(){ ObjectSet result = null; // Open database ObjectContainer db = Db4o.openFile(filename); // Creamos query Query q = db.query(); // Restringimos el query a Empleado q.constrain(Empleado.class); // Descendemos al atributo sueldoBase y restringimos su valor a > 0.3 Constraint constr = q.descend("battingAverage").constrain(new Float(0.3f)).greater(); // Descendemos al atributo Area para descender a nroCargo // con nroCargo > 92, y convinamos estas restricciones q.descend("Area").descend("nroCargo").constrain(new Integer(92)).smaller().and(constr); // Execute query result = q.execute(); // List results System.out.println(result.size()); while(result.hasNext()) { // Print each Empleado Empleado p = (Empleado) result.next(); System.out.println(p); // Obtenemos Empleado y el area donde trabaja Area t = p.getArea(); System.out.println(t); } result.reset(); // Close database db.close(); }

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 25

Anexo Cdigo fuente db4o


CODIGO DE LA CLASE Util
package proyecto.client; import com.db4o.*;

public class Util { public final static String DB4OFILENAME="base_proyecto.db4o"; public static void listResult(ObjectSet result) { System.out.println("total registros a listar: "+result.size()); while(result.hasNext()) { System.out.println(result.next().toString()); } } public static void listResult(java.util.List result){ System.out.println("total registros a listar: "+result.size()); for(int x = 0; x < result.size(); x++) System.out.println(result.get(x)); } public static void listRefreshedResult(ObjectContainer container,ObjectSet result,int depth) { System.out.println(result.size()); while(result.hasNext()) { Object obj = result.next(); container.ext().refresh(obj, depth); System.out.println(obj); } } public static void retrieveAll(ObjectContainer db){ ObjectSet result=db.get(new Object()); listResult(result); } public static void deleteAll(ObjectContainer db) { ObjectSet result=db.get(new Object()); while(result.hasNext()) { db.delete(result.next()); } } }

CODIGO DE LA CLASE PruebaBDOO


package proyecto.client; import com.db4o.Db4o; import com.db4o.ObjectContainer; import com.db4o.ObjectSet; import com.db4o.query.Predicate; import com.db4o.query.Query; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public static void main(String[] args) { new File(Util.DB4OFILENAME).delete(); accessDb4o(); new File(Util.DB4OFILENAME).delete(); ObjectContainer db = Db4o.openFile(Util.DB4OFILENAME);

PGINA 26
String textoIn = null; double numeroIn = 0.0; Calendar fechaIn = null; double indice = 0.0; try { Calendar fechaIni = null; Calendar fechaFin = null; Tablamedidas tablamedida; long diferencia; //pruebas para insercion for (int vn_nro_prueba = 1; vn_nro_prueba < 8; vn_nro_prueba++) {

BASES DE DATOS ORIENTADAS A OBJETOS

fechaIni = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "ini_crear", fechaIni, 0.0); db.set(tablamedida); for (int i = 0; i < 10; i++) { switch (i) { case 0: textoIn = "gamesa"; case 1: textoIn = "telefonica"; case 2: textoIn = "repsol"; case 3: textoIn = "bsch"; case 4: textoIn = "inditex"; case 5: textoIn = "bbva"; case 6: textoIn = "gas natural"; case 7: textoIn = "endesa"; case 8: textoIn = "acciona"; case 9: textoIn = "sogecable"; } for (int j = 0; j < 10; j++) { switch (j) { case 0: numeroIn = 41.45; case 1: numeroIn = 77.12; case 2: numeroIn = 49.31; case 3: numeroIn = 98.08; case 4: numeroIn = 22.72; case 5: numeroIn = 43.53; case 6: numeroIn = 28.53; case 7: numeroIn = 78.21; case 8: numeroIn = 62.84; case 9: numeroIn = 34.29; } for (int k = 0; k < 10; k++) { switch (k) { case 0: fechaIn = fechaIn = new GregorianCalendar(2005, 1, 12); case 1: fechaIn = fechaIn = new GregorianCalendar(2002, 5, 1); case 2: fechaIn = fechaIn = new GregorianCalendar(2003, 9, 7); case 3: fechaIn = fechaIn = new GregorianCalendar(2003, 12, 12); case 4: fechaIn = fechaIn = new GregorianCalendar(2004, 6, 30); case 5: fechaIn = fechaIn = new GregorianCalendar(2005, 2, 22); case 6: fechaIn = fechaIn = new GregorianCalendar(2005, 11, 15); case 7: fechaIn = fechaIn = new GregorianCalendar(2001, 5, 25); case 8: fechaIn = fechaIn = new GregorianCalendar(2000, 7, 27); case 9: fechaIn = fechaIn = new GregorianCalendar(2005, 12, 9); } Tablassr1 tablasrl = new Tablassr1(); tablasrl.set_Tablassr1("" + indice++, textoIn, numeroIn, fechaIn); db.set(tablasrl); } } } Tablassr1 tablasrl = new Tablassr1(); tablasrl.set_Tablassr1("-100", "sogecable", 34.29, new GregorianCalendar(2005, 2, 1, 11, 13));

BASES DE DATOS ORIENTADAS A OBJETOS


db.set(tablasrl); fechaFin = Calendar.getInstance(); diferencia = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "fin_crear", fechaFin, 0.0); db.set(tablamedida);

PGINA 27

tablamedida = new Tablamedidas("" + vn_nro_prueba, "dif_crear", new GregorianCalendar(), diferencia); db.set(tablamedida); //pruebas para actualizacion fechaIni = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "ini_modtexto", fechaIni, 0.0); db.set(tablamedida); updateTablassr1(db, "-100"); fechaFin = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "fin_modtexto", fechaFin, 0.0); db.set(tablamedida); diferencia = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "dif_modtexto", null, diferencia); db.set(tablamedida); // System.out.println("diferencia en modificar texto es ms: " + diferencia); //pruebas de consulta por QBE fechaIni = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "ini_consulta_QBE", fechaIni, 0.0); db.set(tablamedida); consultaCampo1_QBE(db, "-100"); fechaFin = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "fin_consulta_QBE", fechaFin, 0.0); db.set(tablamedida); diferencia = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "dif_consulta_QBE", null, diferencia); db.set(tablamedida); //pruebas de consulta por SODA fechaIni = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "ini_consulta_SODA", fechaIni, 0.0); db.set(tablamedida); consultaCampo1_SODA(db, "-100"); fechaFin = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "fin_consulta_SODA", fechaFin, 0.0); db.set(tablamedida); diferencia = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "dif_consulta_SODA", null, diferencia); db.set(tablamedida); //pruebas de consulta por NATIVE fechaIni = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "ini_consulta_NATIVE", fechaIni, 0.0); db.set(tablamedida); consultaCampo1_NATIVE(db, "-100"); fechaFin = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "fin_consulta_NATIVE", fechaFin, 0.0); db.set(tablamedida); diferencia = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis();

PGINA 28

BASES DE DATOS ORIENTADAS A OBJETOS

tablamedida = new Tablamedidas("" + vn_nro_prueba, "dif_consulta_NATIVE", null, diferencia); db.set(tablamedida); //pruebas para delete fechaIni = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "ini_borrartodos", fechaIni, 0.0); db.set(tablamedida);

deleteAllTablassr1(db); fechaFin = Calendar.getInstance(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "fin_borrartodos", fechaFin, 0.0); db.set(tablamedida); diferencia = fechaFin.getTimeInMillis() - fechaIni.getTimeInMillis(); tablamedida = new Tablamedidas("" + vn_nro_prueba, "dif_borrartodos", null, diferencia); db.set(tablamedida); // System.out.println("diferencia en borrar todos ms: " + diferencia); } retrieveAllTablamedidas(db); //retrieveAllTablassr1(db); } finally { db.close(); } } public static void accessDb4o() { ObjectContainer db = Db4o.openFile(Util.DB4OFILENAME); try { // do something with db4o } finally { db.close(); } } public static void retrieveAllTablassr1(ObjectContainer db) { System.out.println("Consultado Tablassr1"); ObjectSet result = db.get(Tablassr1.class); Util.listResult(result); } public static void retrieveAllTablamedidas(ObjectContainer db) { System.out.println("Consultado Tablamedidas"); ObjectSet result = db.get(Tablamedidas.class); Util.listResult(result); } public static void updateTablassr1(ObjectContainer db, String valorCampo1) { Tablassr1 templeta = new Tablassr1(); templeta.setCampo1(valorCampo1); ObjectSet result = db.get(templeta); Tablassr1 found = (Tablassr1)result.next(); found.setTexto("modificado"); db.set(found); // System.out.println("actualizado el texto del campo1 " + valorCampo1); } public static void consultaCampo1_SODA(ObjectContainer db, String campo1) { Query carquery = db.query(); carquery.constrain(Tablassr1.class); carquery.descend("campo1").constrain(campo1); ObjectSet result = carquery.execute(); Util.listResult(result); } public static void consultaCampo1_QBE(ObjectContainer db, String campo1) { Query carquery = db.query();

BASES DE DATOS ORIENTADAS A OBJETOS


carquery.constrain(Tablassr1.class); carquery.descend("campo1").constrain(campo1); ObjectSet result = carquery.execute(); Util.listResult(result); } public static void consultaCampo1_NATIVE(ObjectContainer db, String campo1) { final String campo1a = campo1; ObjectSet results = db.query(new Predicate() { public boolean match(Tablassr1 tablasr1) { return tablasr1.getCampo1().equals(campo1a); } }); Util.listResult(results); } public static void deleteAllTablassr1(ObjectContainer db) { ObjectSet result = db.get(Tablassr1.class); System.out.println("total registros a borrar: " + result.size()); while (result.hasNext()) { Tablassr1 found = (Tablassr1)result.next(); db.delete(found); } } }

PGINA 29

CODIGO DE LA CLASE Tablassr1


package proyecto.client; import java.util.*; public class Tablassr1 { private String campo1; private String texto; private double numero; private Calendar fecha;

public Tablassr1() { } public void set_Tablassr1(String campo1, String texto, double numero, Calendar fecha) { this.campo1 = campo1; this.texto = texto; this.numero = numero; this.fecha = fecha; } public void setCampo1(String campo1) { this.campo1 = campo1; } public void setTexto(String texto) { this.texto = texto; } public String getTexto() { return texto; } public String toString() { return campo1 + ";" + texto + ";" + numero + ";fecha: " + fecha.getTime(); } }

PGINA 30

BASES DE DATOS ORIENTADAS A OBJETOS

CODIGO DE LA CLASE Tablamedidas


package proyecto.client; import java.util.*; public class Tablamedidas { private String pruebas; private String nombre; private Calendar fechaInicio; private double cantidadSegundos; public Tablamedidas(String pruebas, String cantidadSegundos) { this.pruebas = pruebas; this.nombre = nombre; this.fechaInicio = fechaInicio; this.cantidadSegundos = cantidadSegundos; } public String toString() { return pruebas+";"+nombre+";" +" cantidadSegundos:"+cantidadSegundos; } } nombre, Calendar fechaInicio, double

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 31

Anexo Cdigo fuente Oracle


CREATE OR REPLACE procedure PRUEBASDB.pruebas1 AS vi_pruebas integer; vi_indice integer; vi_bucle1 integer; vi_bucle2 integer; vi_bucle3 integer; varchar2(25); vv_texto vn_numero number(8,2); vd_fecha date; NUMBER(12,6); vn_cantidad_segundos vt_fecha_inicio TIMESTAMP(9); vt_fecha_fin TIMESTAMP(9); begin delete pruebasdb.tablamedidas; vi_pruebas:=1; while vi_pruebas<=7 loop delete pruebasdb.tablasr1; /* FIN CREACIN, INICIALIZACIN DE LAS TABLAS Y VARIABLES */ /* INICIO CREAR REGISTROS */ vt_fecha_inicio := SYSTIMESTAMP; insert into pruebasdb.tablamedidas values (vi_pruebas,'ini_crear', vt_fecha_inicio, null); vi_indice:=1; vi_bucle1:=1; while vi_bucle1<=10 loop case when vi_bucle1=1 then vv_texto:= 'gamesa'; when vi_bucle1=2 then vv_texto:= 'telefonica'; when vi_bucle1=3 then vv_texto:= 'repsol'; when vi_bucle1=4 then vv_texto:= 'bsch'; when vi_bucle1=5 then vv_texto:= 'inditex'; when vi_bucle1=6 then vv_texto:= 'bbva'; when vi_bucle1=7 then vv_texto:= 'gas natural'; when vi_bucle1=8 then vv_texto:= 'endesa'; when vi_bucle1=9 then vv_texto:= 'acciona'; when vi_bucle1=10 then vv_texto:= 'sogecable'; end case; vi_bucle2:=1; while vi_bucle2<=10 loop case when vi_bucle2=1 then vn_numero:= 41.45; when vi_bucle2=2 then vn_numero:= 77.12; when vi_bucle2=3 then vn_numero:= 49.31; when vi_bucle2=4 then vn_numero:= 98.08; when vi_bucle2=5 then vn_numero:= 22.72; when vi_bucle2=6 then vn_numero:= 43.53; when vi_bucle2=7 then vn_numero:= 28.53; when vi_bucle2=8 then vn_numero:= 78.21; when vi_bucle2=9 then vn_numero:= 62.84; when vi_bucle2=10 then vn_numero:= 34.29; end case;

PGINA 32

BASES DE DATOS ORIENTADAS A OBJETOS

vi_bucle3:=1; while vi_bucle3<=10 loop case when vi_bucle3=1 then vd_fecha := '12/ene/05'; when vi_bucle3=2 then vd_fecha := '01/may/02'; when vi_bucle3=3 then vd_fecha := '07/sep03'; when vi_bucle3=4 then vd_fecha := '12/dic/03'; when vi_bucle3=5 then vd_fecha := '30/jun/04'; when vi_bucle3=6 then vd_fecha := '22/feb/05'; when vi_bucle3=7 then vd_fecha := '15/nov/05'; when vi_bucle3=8 then vd_fecha := '25/may/01'; when vi_bucle3=9 then vd_fecha := '27/jul00'; when vi_bucle3=10 then vd_fecha := '09/dic/05'; end case; insert into pruebasdb.TABLAsr1 values (vi_indice, vv_texto, vn_numero, vd_fecha, vv_texto, vn_numero, vd_fecha); vi_indice := vi_indice+1; vi_bucle3 := vi_bucle3+1; end loop; vi_bucle2:=vi_bucle2+1; end loop; vi_bucle1:=vi_bucle1+1; end loop; vt_fecha_fin := SYSTIMESTAMP; insert into pruebasdb.tablamedidas values (vi_pruebas,'fin_crear', vt_fecha_fin, null); select sum((extract(hour from vt_fecha_fin)-extract(hour from vt_fecha_inicio))*3600+ (extract(minute from vt_fecha_fin)-extract(minute from vt_fecha_inicio))*60+ extract(second from vt_fecha_fin)-extract(second from vt_fecha_inicio))*1000 ms into vn_cantidad_segundos from dual; insert into pruebasdb.tablamedidas values (vi_pruebas,'dif_crear', null, vn_cantidad_segundos); /* FIN CREAR REGISTROS */ /* INICIO MODIFICAR TEXTO */ vt_fecha_inicio := SYSTIMESTAMP; insert into pruebasdb.tablamedidas values (vi_pruebas,'ini_modtexto', vt_fecha_inicio, null); update pruebasdb.tablasr1 set campo1=upper(campo1); vt_fecha_fin := SYSTIMESTAMP; insert into pruebasdb.tablamedidas values (vi_pruebas,'fin_modtexto', vt_fecha_fin, null);

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 33

select sum((extract(hour from vt_fecha_fin)-extract(hour from vt_fecha_inicio))*3600+ (extract(minute from vt_fecha_fin)-extract(minute from vt_fecha_inicio))*60+ extract(second from vt_fecha_fin)-extract(second from vt_fecha_inicio))*1000 ms into vn_cantidad_segundos from dual; insert into pruebasdb.tablamedidas values (vi_pruebas,'dif_modtexto', null, vn_cantidad_segundos); /* FIN MODIFICAR TEXTO */ /* INICIO BORRAR TODOS LOS REGISTROS */ vt_fecha_inicio := SYSTIMESTAMP; insert into pruebasdb.tablamedidas values (vi_pruebas,'ini_borrartodos', vt_fecha_inicio, null); delete pruebasdb.tablasr1; vt_fecha_fin := SYSTIMESTAMP; insert into pruebasdb.tablamedidas values (vi_pruebas,'fin_borrartodos', vt_fecha_fin, null); select sum((extract(hour from vt_fecha_fin)-extract(hour from vt_fecha_inicio))*3600+ (extract(minute from vt_fecha_fin)-extract(minute from vt_fecha_inicio))*60+ extract(second from vt_fecha_fin)-extract(second from vt_fecha_inicio))*1000 ms into vn_cantidad_segundos from dual; insert into pruebasdb.tablamedidas values (vi_pruebas,'dif_borrartodos', null, vn_cantidad_segundos); /* FIN BORRAR TODOS LOS REGISTROS */ vi_pruebas:=vi_pruebas+1; end loop; end; /

PGINA 34

BASES DE DATOS ORIENTADAS A OBJETOS

Anexo Cdigo fuente SqlServer


PROCEDURE prueba1 AS declare @indice int declare @bucle1 int declare @bucle2 int declare @bucle3 int declare @pruebas int declare @texto varchar(25) declare @fecha datetime declare @numero numeric(6,2) declare @t1 datetime declare @t2 datetime set @pruebas = 1 WHILE @pruebas <= 7 BEGIN insert into TABLAMEDIDAS (idprueba, marca, tiempo) values (@pruebas,'ini_crear_tsr1',getdate()); set @t1 = (select tiempo from TABLAMEDIDAS where (idprueba=@pruebas AND marca='ini_crear_tsr1' )) set @indice = 1 set @bucle1 = 1 WHILE @bucle1 <= 10 BEGIN IF (@bucle1=1) set @texto='gamesa' IF (@bucle1=2) set @texto='telefonica' if (@bucle1=3) set @texto='repsol' if (@bucle1=4) set @texto='bsch' if (@bucle1=5) set @texto='inditex' if (@bucle1=6) set @texto='bbva' if (@bucle1=7) set @texto='gas natural' if (@bucle1=8) set @texto='endesa' if (@bucle1=9) set @texto='acciona' if (@bucle1=10) set @texto='sogecable' SET @bucle2 = 1 WHILE @bucle2 <= 10 BEGIN IF (@bucle2=1) set @numero='41.45' IF (@bucle2=2) set @numero='77.12' if (@bucle2=3) set @numero='49.31' if (@bucle2=4) set @numero='98.08' if (@bucle2=5) set @numero='22.72' if (@bucle2=6) set @numero='43.53' if (@bucle2=7) set @numero='28.53' if (@bucle2=8) set @numero='78.21' if (@bucle2=9) set @numero='62.84' if (@bucle2=10) set @numero='34.29' SET @bucle3 = 1 WHILE @bucle3 <= 10 BEGIN IF (@bucle3=1) set @fecha='01/dic/05' IF (@bucle3=2) set @fecha='05/ene/02' if (@bucle3=3) set @fecha='09/jul/03' if (@bucle3=4) set @fecha='12/dic/03' if (@bucle3=5) set @fecha='30/jun/04' if (@bucle3=6) set @fecha='02/feb/05' if (@bucle3=7) set @fecha='11/nov/05' if (@bucle3=8) set @fecha='05/may/01' if (@bucle3=9) set @fecha='07/jul/00' if (@bucle3=10) set @fecha='12/sep/05' INSERT into TABLA1 values (@indice, @texto, @numero, @fecha, @texto, @numero, @fecha);

BASES DE DATOS ORIENTADAS A OBJETOS

PGINA 35

SET @indice = @indice+1; SET @bucle3 = @bucle3+1 end SET @bucle2 = @bucle2+1 end SET @bucle1 = @bucle1+1 end insert TABLAMEDIDAS(idprueba, marca, tiempo) values (@pruebas,'fin_crear_tsr1',getdate()); set @t2 = (select tiempo from TABLAMEDIDAS where (idprueba=@pruebas AND marca='fin_crear_tsr1' )) insert TABLAMEDIDAS(idprueba, marca, milisg) values (@pruebas,'dif_crear_tsr1',datediff(ms,@t1,@t2) ) -- modificar texto insert into TABLAMEDIDAS(idprueba, marca, tiempo) values (@pruebas,'ini_modtexto_tsr1', getdate()); set @t1 = (select tiempo from TABLAMEDIDAS where (idprueba=@pruebas AND marca='ini_modtexto_tsr1' )) UPDATE TABLA1 SET campo1=UPPER(campo1); insert into TABLAMEDIDAS(idprueba, marca, tiempo) values (@pruebas,'fin_modtexto_tsr1', getdate()); set @t2 = (select tiempo from TABLAMEDIDAS where (idprueba=@pruebas AND marca='fin_modtexto_tsr1' )) insert into TABLAMEDIDAS(idprueba, marca, milisg) values (@pruebas,'dif_modtexto_tsr1',datediff(ms,@t1,@t2) ) -- borrar todos insert into TABLAMEDIDAS(idprueba, marca, tiempo) values (@pruebas,'ini_borrartodos_tsr1', getdate()); set @t1 = (select tiempo from TABLAMEDIDAS where (idprueba=@pruebas AND marca='ini_borrartodos_tsr1' )) delete from tabla1; insert into TABLAMEDIDAS(idprueba, marca, tiempo) values (@pruebas,'fin_borrartodos_tsr1', getdate()); set @t2 = (select tiempo from TABLAMEDIDAS where (idprueba=@pruebas AND marca='fin_borrartodos_tsr1' )) insert into TABLAMEDIDAS(idprueba, marca, milisg) values (@pruebas,'dif_borrartodos_tsr1',datediff(ms,@t1,@t2) ) SET @pruebas = @pruebas+1 end GO

Vous aimerez peut-être aussi