Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parMichele Rancourt Modifié depuis plus de 8 années
1
Stratégies de persistence pour une application Java J.M. Vanel Mars 2006 Version 5 Historique V3Un autre OODBMS : db4o; détails Stockage sur Fichiers V4CRUD avec Protégé V5 requêtes avec Protégé
2
Plan de la présentation ● Notions de base ● Critères de choix ● Solutions
3
Problématique ● Comment assurer que les objets permanents de l'application survivent à l'arrêt et au redémarrage de l'application – Y compris au plantage ● Fonctionnalité transversale qui s'accompagne de beaucoup d'autres fonctionalités : requêtes, transactions,...
4
Notions de base ● Graphe d'objets ● POJO (Plain Old Java Object) ● Cycle de vie d'un objet ● Transactions ● Technologies utilisées Vocabulaire « Anglais » CRUD = Create, Read, Update, Delete
5
Graphe d'objets ● Définition: tous les objets atteignables à partir d'un objet donné (directement ou non) ● Si on ne fait pas attention aux dépendances, tous les objets de l'application peuvent être atteints! ● Analogue à la problématique de la sérialisation ● Les outils peuvent stocker un objet seul, ou tout le graphe
6
POJO (Plain Old Java Object) ● Définition: objet métier pur, aucune dépendance à des classes techniques ● Donc facilement testable
7
Cycle de vie d'un objet ● Création ==> en mémoire ● Initialisé ● Sauvé (persistence) ● Modifié ● Mise à jour (persistence) ● destruction
8
Transactions ● Définition: une sorte de brouillon qui rassemble une série de modifications qui ne sont pas encore validées ● En fin de transaction: Validée ou retour en arrière ● Les contraintes ne sont pas imposées avant la fin ● Sémantique métier associée (exemple transfert de compte à compte) ● La plupart des bases ne font rien en dehors d'une transaction
9
Technologies utilisées ● Outils de manipulation du code binaire Java – Permettent d'instrumenter le code à la volée – BCEL – CGLib, utilisé par Hibernate, Spring, etc – AOP (Aspect Oriented Programming) ● Introspection ( alias réflection )
10
Critères de choix ● Volume de données ● Performances: mises à jour, requêtes ● Gestion des permissions ● Pérénnité de la solution ● Pérénnité des données ● Partage entre plusieurs clients ● Transactions ; ACID ( Atomique, Consistent, Isolation, Durabilité) ● Déclencheur (trigger) ● versionnement
11
Solutions ● Stockage sur Fichiers ● Correspondance Objet-Relationnel (ORM – Object- Relational Mapping); EJB ● Bases de données Orientées Objet (OODBMS – Object Oriented Database Management Systems) ● Bases de données XML ● Dépots et référentiels : FTP, WebDav, CVS, Subversion,... ( repository ) ● Base de connaissance (knowledge base)
12
Stockage sur Fichiers - 1 ● Adapté pour configuration, IHM graphiques, fichiers de données (souvent zippés) ● Technologies: – Sérialisation Java classique JDK (binaire) – Sérialisation Java en XML (via classes XMLEncoder et XMLDecoder) – Correspondance objet-XML : XStream, Castor, XMLBeans, Zeus – Fichiers Properties (via classe Properties)
13
Stockage sur Fichiers - 2 2 catégories d'outils: ● Prennent en compte les propriétés (convention de nommage get/set de JavaBean) – Les Sérialisation Java classique JDK (binaire) – Sérialisation Java en XML (via classes XMLEncoder et XMLDecoder) – Correspondance objet-XML : Castor, XMLBeans ● Prennent en compte les champs (même privés) – XStream
14
Stockage sur Fichiers - 3 Graphe d'objets ● Pris en compte: – Les Sérialisation Java classique JDK (binaire) – Sérialisation Java en XML (via classes XMLEncoder et XMLDecoder) – Correspondance objet-XML : XMLBeans, XStream ● Pas pris en compte: – Castor
15
Sauver un graphe d’objets en XML : 1 - XMLEncoder String saveFileName = getSaveFileName(); XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream( saveFileName))); e.writeObject( testSpec ); e.close();
16
Sauver un graphe d’objets en XML : 2 - XMLDecoder Pour relire l'objet sauvé, il faut utiliser XMLDecoder : XMLDecoder d = new XMLDecoder( new BufferedInputStream( new FileInputStream( getSaveFileName()))); testSpec = (TestSpecification) d.readObject(); d.close();
17
Stockage sur Fichiers ● Les plus – Très simples à mettre en oeuvre – Pas de d'adhérence architecturale ● les moins – Pas de requêtes ( sauf Xstream en Xquery) – mises à jour: tout ou rien – Partage entre plusieurs clients sur plusieurs machines difficile – Déclencheur (trigger) difficile
18
ORM ● Les plus: – Offre suffisante, open source et commerciale – POJO pris en compte – Prise en compte des spécificités de chaque base, traduction d'exceptions ● Les moins: – Correspondance entre programmation et stockage indirecte
19
Hibernate Sauver un objet : Session session = getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); Message message = new Message( "Hello World"); session.save(message); tx.commit(); session.close();
20
Hibernate Requête : // ouvrir Session et Transaction... List messages = newSession.find( from Message as m order by m.text asc "from Message as m order by m.text asc"); System.out.println( messages.size() + " message(s) found:" ); for ( Iterator iter = messages.iterator(); iter.hasNext(); ) { Message message = (Message) iter.next(); System.out.println( message.getText() ); } newTransaction.commit(); newSession.close();
21
Hibernate - configuration Exemple correspondance simple ????
22
Hibernate – config. avancée ● ????
23
DAO – Data Access Object
24
Bases de données Orientées Objet (OODBMS) ● Les standards: ODMG, JDO ● Les plus: – Correspondance directe entre programmation et stockage ● Les moins: – Offre assez réduite – Pas toujours de POJO ● Le plus connu: Versant ● Open source: EyeDB, db4o (db4objects) db4o
25
Un OODBMS : eyeDB ● Écrit en C++ ● Programmation C++ et Java ● Accès local ou réseau ● Agréable interface en ligne de commande ● Suit le standard ODMG ● Existe depuis 1994, open source en 2006 ● Utilisé en bio-informatique ● chargement des objets et gestion du cache transparents
26
EyeDB : language ODL Object Definition language // fichier person.odl class Person { string firstname; string lastname; int age; Address addr; Person * spouse inverse Person::spouse; set children; }; // autres classes...
27
language ODL ● Niveau d' abstraction plus élevé que les interfaces Java, à peu près celui du modèle de classes UML – Notations à la C++ ● Distinction entre composition ( pas de * ) et agrégation simple ( * ) ● Ensembles et listes: set
28
EyeDB : accès en Java - 0 ● Entrer les définitions de classes dans la base eyedbodl -d my_database --update \ --package=person person.odl ● Génération de code Java eyedbodl --gencode=Java --package=person \ person.odl
29
EyeDB : accès en Java – création de données - 1 String[] outargs = org.eyedb.Root.init("TestP", args); // digère les arguments spécifiques person.Database.init(); org.eyedb.Connection conn = new org.eyedb.Connection(); // ici accès réseau possible // database nommée outargs[0] person.Database db = new person.Database(outargs[0]); db.open(conn, org.eyedb.Database.DBRW); db.transactionBegin();
30
EyeDB : accès en Java - création de données - 2 Person john = new Person(db); john.setName("john"); john.setAge(32); Person mary = new Person(db); mary.setName("mary"); // Mariage : john.setSpouse(mary); // Stocker john et mary dans la base john.store(org.eyedb.RecMode.FullRecurs); db.transactionCommit();
31
EyeDB : requêtes en Java org.eyedb.OQL q = new org.eyedb.OQL(db, "select Person.name = \"john\" " ); org.eyedb.ObjectArray obj_array = new org.eyedb.ObjectArray(); q.execute(obj_array); if (obj_array.getCount() == 0) { System.err.println("TestPC: cannot find person 'john' "); System.exit(1); } Person john = (Person)obj_array.getObjects()[0];
32
Un autre OODBMS : db4o ● Écrit en Java ● POJO stockés ● Trois façons de faire des requêtes: – Query by Example (QBE), – Native Queries (NQ) : un nouveau concept introduit par les auteurs de ddb4o – SODA Query API (SODA) : bas niveau ● chargement des objets et gestion du cache non transparents
33
db4o : Native Query List result = db.query( new Predicate () { public boolean match(Pilot pilot) { return pilot.getPoints() > 99 && pilot.getPoints() < 199 || pilot.getName().equals( "Rubens Barrichello"); } }); Le code de match() est analysé et traduit par un optimiseur.
34
Bases de données XML - 1 ● Un peu en dehors de notre sujet, car ne stockent pas directement des objets Java, mais des documents XML ● À l'aide d'un des outils de correspondance Objet- XML, on peut cependant stocker des objets Java – Mais XQuery n'intègre pas alors la notion de graphe d'objets ● Le langage de requêtes Xquery (basé sur Xpath) est très puissant
35
Bases de données XML - 2 Les implémentations ● Fonctionnalités XML et XQuery greffées sur les bases relationnelles commerciales: Oracle, SQL server ● Bases XML natives commerciales: – Tamino, MarkLogic, X-Hive ● Bases XML natives open source: – eXist (Java, plus orientée documents) ; – Berkeley XML (C++, plus orientée données)
36
Bases de données XML - 3 eXist ● Indexation sur – texte entier d'un noeud – Mots du texte ● Gestion des permissions ● importation/exportation d'une arborescence de fichiers XML; CRUD ● Accès concurrents: embarqué; IHM Swing; réseau via Soap, XML-RPC, WebDav, REST ● Récupération après plantage système par journalisation ● Transactions : infrastructure de journalisation existe ● Déclencheur (trigger)
37
Dépots et référentiels : FTP, WebDav, CVS, Subversion,... ● Tous ces dépôts permettent de partager via le réseau une arborescence de fichiers ● Facilement accessibles par programme et par de nombreux clients ● CVS et Subversion prennent en compte les aspects versionnement et fusion des modifications, mais pas vraiment les requêtes
38
Base de connaissance (knowledge base) ● Le couteau Suisse: Protégé de l'Université de Stanford (origine: bases de connaissances médicales): – 100% Java et Open source – IHM graphique – Bibliothèque et interface Java – En mémoire ou avec un stockage relationnel – Nombreux greffons (plugin) pour différents langages et raisonneurs ● Modèle plus riche qu'un modèle de type UML ou Orienté Objet, permet des raisonnements
39
Protégé : accès en Java - 1 Définir des classes dans la base OWLModel owlModel = ProtegeOWL.createJenaOWLModel(); OWLNamedClass personClass = owlModel.createOWLNamedClass( "Person"); OWLDatatypeProperty ageProperty = owlModel.createOWLDatatypeProperty( "age"); ageProperty.setRange( owlModel.getXSDint()); ageProperty.setDomain( personClass); OWLObjectProperty childrenProperty = owlModel.createOWLObjectProperty("children"); childrenProperty.setRange(personClass); childrenProperty.setDomain(personClass);
40
Protégé : accès en Java - 2 Définir des instances RDFIndividual darwin = personClass.createRDFIndividual( "Darwin"); darwin.setPropertyValue( ageProperty, new Integer(0) ); RDFIndividual holgi = personClass.createRDFIndividual( "Holger"); // Création d'une association entre individus holgi.setPropertyValue( childrenProperty, darwin); holgi.setPropertyValue( ageProperty, new Integer(33) );
41
Protégé : requêtes en Java Collection results = owlModel.getRDFResourcesWithPropertyValue( ageProperty, new Integer(33) ); // renvoie une liste de RDFResource Pour des requêtes plus compliquées: ● On définit une classe Protégé ad-hoc ● Langage SPARQL du W3C Réferences: ● Protege Programming dans la documentation Protégé - OWL Protege Programming ● Working with the Protégé APIs Working with the Protégé APIs ● using the Core Protégé API from other applications using the Core Protégé API from other applications ● Ma présentation sur la programmation basée sur ontologiesprésentation sur la programmation basée sur ontologies
42
Protege-OWL: modèle observateur Exemple: réagir à une création d'instance: owlNamedClass.addClassListener( new ClassAdapter() { public void instanceAdded( RDFSClass cls, RDFResource instance ){ System.out.println( "Instance ajoutée à la classe: " + instance.getName()); }; }); owlNamedClass.createOWLIndividual(«newName»);
43
Protege-OWL: raisonneurs Raisonneurs en Logique de Description ● algorithme qui calcule si un concept est une sous-classe d'un autre concept – Idem sur les instances ● déterminer si une classe est consistente ● protocole HTTP (DIG) entre Protégé et les raisonneurs disponibles: – RACER – FaCT – FaCT++ – Pellet
44
Protege-OWL: raisonneurs 2 http://protege.stanford.edu/plugins/owl/api/ReasonerAPIExamples.htm l ReasonerManager reasonerManager = ReasonerManager.getInstance(); ProtegeOWLReasoner reasoner = reasonerManager.getReasoner(model); // Set the reasoner URL and test the connection reasoner.setURL(REASONER_URL); if(reasoner.isConnected()) { //... }
45
Protege-OWL: raisonneurs 3 // on classifie l'ontologie entière, ce qui mettra information déduite sur la hiérarchie de classe directement dans le modèle Protégé. reasoner.classifyTaxonomy(null); System.out.println("Inferred subclasses of VegetarianPizza:"); inferredSubclasses = vegetarianPizza.getInferredSubclasses(); // peut aussi employer les méthodes sur ProtegeOWLReasoner pour obtenir l'information au coup par coup sur une classe ou une instance
46
Protege-OWL: règles avec SWRL ????
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.