Académique Documents
Professionnel Documents
Culture Documents
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
4 5
rendimientos
bases de datos
7 8
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
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
PGINA 3
variaciones
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.
PGINA 4
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
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).
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).
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
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();
//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.
public class Tablassr1 { private String campo1; private String texto; private double numero; private Calendar fecha; . }
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.
String
Tablassr1 tablasrl = new Tablassr1(); tablasrl.set_Tablassr1("" + indice++, textoIn, numeroIn, fechaIn); db.set(tablasrl);
updateTablassr1(db, "-100");
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); }
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); }
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); }
PGINA 9
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); }
Total 622 78 95
PGINA 10
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)
PGINA 11
Los algoritmos utilizados para estas pruebas se encuentran en los anexos para los tres gestores de bases de datos. Obtuvimos los siguientes resultados:
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
Para el borrado de datos se puede apreciar que el ms rpido es SqlServer, posteriormente casi similares se encuentran db4o y Oracle respectivamente.
PGINA 13
PGINA 14
PGINA 15
PGINA 16
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.
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
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
/** * 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();
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
/** * 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(); }
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
/** * 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(); }
PGINA 25
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()); } } }
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++) {
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));
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
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();
PGINA 29
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
PGINA 31
PGINA 32
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);
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
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