La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

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 ????


Télécharger ppt "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."

Présentations similaires


Annonces Google