Point Base Uni Sync

1 369 vues

Publié le

Synchronisation de bases de données avec Unisync de PointBase

Publié dans : Technologie, Business
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 369
Sur SlideShare
0
Issues des intégrations
0
Intégrations
17
Actions
Partages
0
Téléchargements
4
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Point Base Uni Sync

  1. 1. IME – Informatique Mobile d’Entreprise PointBase UniSync Sébastien Letélié Ingénieur d’études et de développement [email_address]
  2. 2. Plan de la présentation <ul><li>PointBase </li></ul><ul><ul><li>Société </li></ul></ul><ul><ul><li>produits </li></ul></ul><ul><li>PointBase UniSync </li></ul><ul><li>Comment ça marche ? </li></ul><ul><li>Publication </li></ul><ul><li>Souscriptions </li></ul><ul><li>Détection et résolution de conflits </li></ul><ul><li>Exemples </li></ul><ul><li>Conclusion </li></ul>
  3. 3. PointBase <ul><li>Fondée en 1998 par Bruce Scott, co-fondateur d’Oracle </li></ul><ul><li>Le slogan : l’information partout où vous la voulez ! </li></ul><ul><li>Ensemble de 4 produits destinés à gérer les données d’entreprise : </li></ul><ul><ul><li>PointBase Server : un RDBMS 100% Java pour les applications client/serveur à grande échelle (e-commerce, serveur d’applications …), intégrant JDBC, le transactionnel, et les connections multiples </li></ul></ul><ul><ul><li>PointBase Embedded : un RDBMS 100% Java pour les applications embarquées (genre agenda), intégrant JDBC, les connections multiples sur la même JVM </li></ul></ul><ul><ul><li>PointBase Micro : un RDBMS 100% Java pour les applications destinées au terminaux mobiles (PDA, téléphones), intégrant MIDP et une sous-classe de JDBC </li></ul></ul><ul><ul><li>PointBase UniSync : un framework de synchronisation bidirectionnel, pouvant s’interfacer avec des bases de données comme Oracle, MS SQL, intégrant la résolution de conflits et le filtrage de tables </li></ul></ul>
  4. 4. PointBase UniSync <ul><li>Permet de synchroniser des données entre des BDD compatibles JDBC </li></ul><ul><li>C’est une API qui se situe à la frontière entre JDBC et l’application cliente </li></ul><ul><li>3 types d’API sont disponibles suivant les plates-formes JAVA (J2EE, J2SE, J2ME) </li></ul><ul><li>Basé sur un modèle Publish/Subscribe client/serveur </li></ul><ul><li>Les données qui transitent sont encryptées </li></ul><ul><li>Utilise TCP/IP ou HTTP </li></ul>
  5. 5. Comment ça marche ? <ul><li>Le SyncDataSource représente l’accès à la base de donnée compatible Java </li></ul><ul><li>Une classe SyncManager est appelée au démarrage pour configurer les SyncDataSource, les Hubs et les Spokes </li></ul>SyncDataSource Serveur SyncDataSource Client <ul><li>Une classe Hub coté serveur publie les tables synchronisables </li></ul><ul><li>Une classe Spoke coté client souscrit à cette publication </li></ul>
  6. 6. Publication <ul><li>Une publication d’un Hub permet de diffuser </li></ul><ul><ul><li>Toutes les tables de la base </li></ul></ul><ul><ul><li>Certaines tables </li></ul></ul><ul><ul><li>Certaines tables avec un filtre </li></ul></ul><ul><ul><li>Certaines colonnes de tables </li></ul></ul><ul><li>Chaque publication est nommée, et c’est par ce nom que les souscriptions se soumettent </li></ul><ul><li>Le souscripteur ne peut synchroniser que sur les tables que la publication à diffusées </li></ul>
  7. 7. Souscription <ul><li>Une souscription d’un Spoke permet </li></ul><ul><ul><li>Récupérer les tables publiées (getSnapshot()) </li></ul></ul><ul><ul><li>Récupérer les modifications faites coté serveur (getPointUpdate()) </li></ul></ul><ul><ul><li>Mettre à jour les modifications locales (putPointUpdate()) </li></ul></ul><ul><ul><li>Combiner les 2 points précédents (sync()) </li></ul></ul><ul><li>Un Spoke est crée en déterminant l’URL d’accès au Hub (saveHubURL()) </li></ul>
  8. 8. Détection et résolution de conflits (1) <ul><li>4 types de conflits sont détectés : </li></ul><ul><ul><li>UPDATE_UPDATE : 2 clients mettent à jour sur le serveur une même ligne </li></ul></ul><ul><ul><li>INSERT_INSERT : 2 clients insèrent une nouvelle ligne avec la même clé primaire </li></ul></ul><ul><ul><li>UPDATE_DELETE : un client met à jour une ligne supprimée par un autre </li></ul></ul><ul><ul><li>DELETE_UPDATE : un client supprime une ligne mise à jour par un autre </li></ul></ul><ul><li>Un conflit n’est pas détecté si le deux clients mettent à jour une information similaire </li></ul><ul><li>2 niveaux de résolution : </li></ul><ul><ul><li>Au niveau de la publication </li></ul></ul><ul><ul><li>Au niveau d’une table </li></ul></ul>
  9. 9. Détection et résolution de conflits (2) <ul><li>4 types de résolution : </li></ul><ul><ul><li>CR_NONE : pas de détection de conflits, les mises à jour du client sont toujours valides </li></ul></ul><ul><ul><li>CR_SPOKE_WINS : détection du conflit, c’est le client qui impose sa mise à jour </li></ul></ul><ul><ul><li>CR_HUB_WINS : détection du conflit, c’est le serveur qui impose sa mise à jour </li></ul></ul><ul><ul><li>User-Defined : détection du conflit et appel d’un classe spécifique pour le résoudre </li></ul></ul><ul><li>Exemples : </li></ul><ul><ul><li>Resolution de conflit au niveau publication : </li></ul></ul><ul><ul><ul><li>pub.setConflictResolver(&quot;CR_HUB_WINS&quot;) </li></ul></ul></ul><ul><ul><li>Resolution de conflit au niveau table : </li></ul></ul><ul><ul><ul><li>pub.setConflictResolver(&quot;PBPUBLIC.NameCard&quot;, &quot;CR_HUB_WINS&quot;) </li></ul></ul></ul><ul><ul><li>Resolution de conflit défini par l’utilisateur : </li></ul></ul><ul><ul><ul><li>pub.setConflictResolver(&quot;PBPUBLIC.NameCard&quot;, &quot;com.acme.MyConflictResolver&quot;) </li></ul></ul></ul>
  10. 10. Exemples (1) <ul><li>Création d’un Hub </li></ul>private static final String m_CDriver = &quot;com.pointbase.jdbc.jdbcUniversalDriver&quot;; private static final String m_CURL = &quot;jdbc:pointbase://localhost:9092/hubdb&quot;; private static final String m_CUser = &quot;pbpublic&quot;; private static final String m_CPassword = &quot;pbpublic&quot;; private static final String PUB = &quot;Pub1&quot;; private static final String HUBNAME = &quot;Hub1&quot;; public void configureHub2() { try { // First get an instance of the SyncManager SyncManager l_SyncManager = SyncManager.getInstance(m_CURL, m_CDriver, m_CUser, m_CPassword); // Check if the Hub already exists Hub l_Hub = l_SyncManager.getHub(HUBNAME); if(l_Hub == null) { // Create the Hub from the SyncManager l_Hub = l_SyncManager.createHub(HUBNAME); l_Hub.startServer(); } // Publish specified tables String[] tableNames = new String[]{&quot;SCOTT.TABLE1&quot;, &quot;SCOTT.TABLE2&quot;}; // Check if the Publication already exists Publication l_Pub = l_Hub.getPublication(PUB); if(l_Pub == null) { // Create a new Publication l_Pub = l_Hub.newPublication(PUB, SyncDataSource.DEFAULT, tableNames); // Save the Publication l_Hub.publish(l_Pub); } } catch(Exception e) { // Handle the exception here } }
  11. 11. Exemples (2) <ul><li>Création d’un Spoke associé </li></ul>private static final String m_SDriver = &quot;com.pointbase.jdbc.jdbcUniversalDriver&quot;; private static final String m_SURL = &quot;jdbc:pointbase://localhost:9093/spokedb&quot;; private static final String m_SUser = &quot;pbpublic&quot;; private static final String m_SPassword = &quot;pbpublic&quot;; private static final String PUB = &quot;Pub1&quot;; private static final String SUB = &quot;Sub1&quot;; private static final String SPOKENAME = &quot;Spoke1&quot;; private static final String m_HubURL = &quot;tcp://localhost:8123&quot;; public void configureSpoke1() { try { // First get an instance of the SyncManager SyncManager l_SyncManager = SyncManager.getInstance(m_SURL, m_SDriver, m_SUser, m_SPassword); // Check if the Spoke already exists Spoke l_Spoke = l_SyncManager.getSpoke(SPOKENAME); if(l_Spoke == null) { // Create the Spoke from the SyncManager l_Spoke = l_SyncManager.createSpoke(SPOKENAME); // Save the URL to connect to the hub l_Spoke.saveHubURL(m_HubURL); } // Subscribe to Publication PUB. This should get all the SyncTables from the Publication // Check if the Subscription already exists Subscription l_Sub = l_Spoke.getSubscription(SUB); if(l_Sub == null) { SyncDataSource l_DataSource = l_SyncManager.getSyncDataSource(SyncDataSource.DEFAULT); // Get all the tablenames from schema &quot;SCOTT&quot; String[] tableNames = l_DataSource.getAllTableNames(&quot;SCOTT&quot;); // Create a new Subscription l_Sub = l_Spoke.newSubscription(SUB, SyncDataSource.DEFAULT, PUB, tableNames); // Save the Subscription l_Spoke.subscribe(l_Sub); } // Get the full snapshot from the Hub l_Spoke.getSnapshot(SUB); } catch(Exception e) { // Handle the exception here } }
  12. 12. Conclusion <ul><li>PointBase utilise un ensemble de tables qui s’ajoute dans le schéma de base pour gérer la synchronisation </li></ul><ul><li>UniSync est soit disant compatible avec toutes les bases JAVA mais cela reste à tester, car il y a un jar dédié à Oracle et un dédié à SQL Server et je ne vois pas pourquoi </li></ul><ul><li>Les performances ont l’air d’être au rendez-vous, cependant cela reste à tester </li></ul><ul><li>Un outil graphique permet de configurer les DataSource, les Hubs et les Spokes </li></ul><ul><li>Cet outil répond cependant à un bon nombre de besoins liés à la mobilité </li></ul><ul><li>Avec son modèle Publish/Subscribe, il est basé sur le même principe que la maquette AXIS/JMS de IME </li></ul>
  13. 13. Contacts <ul><li>IMPROVE </li></ul><ul><li>74/80, rue Roque de Fillol </li></ul><ul><li>92800 PUTEAUX </li></ul><ul><li>Tél. : 01.41.97.83.20 </li></ul><ul><li>Mail : [email_address] </li></ul><ul><li>URL : http://www.improve.fr </li></ul><ul><li>Informations techniques </li></ul><ul><li>http://www.application-servers.com </li></ul><ul><li>« XML pour l’entreprise » (Livre blanc) </li></ul>

×