IME – Informatique Mobile d’Entreprise PointBase UniSync Sébastien Letélié Ingénieur d’études et de développement [email_address]
Plan de la présentation PointBase Société produits PointBase UniSync Comment ça marche ? Publication Souscriptions Détection et résolution de conflits Exemples Conclusion
PointBase Fondée en 1998 par Bruce Scott, co-fondateur d’Oracle Le slogan : l’information partout où vous la voulez ! Ensemble de 4 produits destinés à gérer les données d’entreprise : 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 PointBase Embedded : un RDBMS 100% Java pour les applications embarquées (genre agenda), intégrant JDBC, les connections multiples sur la même JVM 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 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
PointBase UniSync Permet de synchroniser des données entre des BDD compatibles JDBC C’est une API qui se situe à la frontière entre JDBC et l’application cliente 3 types d’API sont disponibles suivant les plates-formes JAVA (J2EE, J2SE, J2ME) Basé sur un modèle Publish/Subscribe client/serveur Les données qui transitent sont encryptées Utilise TCP/IP ou HTTP
Comment ça marche ? Le SyncDataSource représente l’accès à la base de donnée compatible Java  Une classe SyncManager est appelée au démarrage pour configurer les SyncDataSource, les Hubs et les Spokes SyncDataSource Serveur SyncDataSource Client Une classe  Hub  coté serveur publie les tables synchronisables Une classe  Spoke  coté client souscrit à cette publication
Publication Une publication d’un Hub permet de diffuser Toutes les tables de la base Certaines tables Certaines tables avec un filtre Certaines colonnes de tables Chaque publication est nommée, et c’est par ce nom que les souscriptions se soumettent Le souscripteur ne peut synchroniser que sur les tables que la publication à diffusées
Souscription Une souscription d’un Spoke permet Récupérer les tables publiées (getSnapshot()) Récupérer les modifications faites coté serveur (getPointUpdate()) Mettre à jour les modifications locales (putPointUpdate()) Combiner les 2 points précédents (sync()) Un Spoke est crée en déterminant l’URL d’accès au Hub (saveHubURL())
Détection et résolution de conflits (1)  4 types de conflits sont détectés : UPDATE_UPDATE : 2 clients mettent à jour sur le serveur une même ligne INSERT_INSERT : 2 clients insèrent une nouvelle ligne avec la même clé primaire UPDATE_DELETE : un client met à jour une ligne supprimée par un autre DELETE_UPDATE : un client supprime une ligne mise à jour par un autre Un conflit n’est pas détecté si le deux clients mettent à jour une information similaire 2 niveaux de résolution : Au niveau de la publication Au niveau d’une table
Détection et résolution de conflits (2) 4 types de résolution : CR_NONE : pas de détection de conflits, les mises à jour du client sont toujours valides CR_SPOKE_WINS : détection du conflit, c’est le client qui impose sa mise à jour CR_HUB_WINS : détection du conflit, c’est le serveur qui impose sa mise à jour User-Defined : détection du conflit et appel d’un classe spécifique pour le résoudre Exemples : Resolution de conflit au niveau publication : pub.setConflictResolver("CR_HUB_WINS")  Resolution de conflit au niveau table : pub.setConflictResolver("PBPUBLIC.NameCard", "CR_HUB_WINS") Resolution de conflit défini par l’utilisateur : pub.setConflictResolver("PBPUBLIC.NameCard", "com.acme.MyConflictResolver")
Exemples (1) Création d’un Hub private static final String m_CDriver = "com.pointbase.jdbc.jdbcUniversalDriver"; private static final String m_CURL = "jdbc:pointbase://localhost:9092/hubdb"; private static final String m_CUser = "pbpublic"; private static final String m_CPassword = "pbpublic"; private static final String PUB  = "Pub1"; private static final String HUBNAME  = "Hub1"; 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[]{"SCOTT.TABLE1", "SCOTT.TABLE2"}; // 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 } }
Exemples (2) Création d’un Spoke associé private static final String m_SDriver = "com.pointbase.jdbc.jdbcUniversalDriver"; private static final String m_SURL = "jdbc:pointbase://localhost:9093/spokedb"; private static final String m_SUser = "pbpublic"; private static final String m_SPassword = "pbpublic"; private static final String PUB  = "Pub1"; private static final String SUB  = "Sub1"; private static final String SPOKENAME = "Spoke1"; private static final String m_HubURL = "tcp://localhost:8123"; 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 "SCOTT" String[] tableNames = l_DataSource.getAllTableNames("SCOTT"); // 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 } }
Conclusion PointBase utilise un ensemble de tables qui s’ajoute dans le schéma de base pour gérer la synchronisation 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 Les performances ont l’air d’être au rendez-vous, cependant cela reste à tester Un outil graphique permet de configurer les DataSource, les Hubs et les Spokes Cet outil répond cependant à un bon nombre de besoins liés à la mobilité Avec son modèle Publish/Subscribe, il est basé sur le même principe que la maquette AXIS/JMS de IME
Contacts IMPROVE 74/80, rue Roque de Fillol 92800 PUTEAUX Tél. : 01.41.97.83.20 Mail : [email_address] URL : http://www.improve.fr Informations techniques http://www.application-servers.com « XML pour l’entreprise » (Livre blanc)

Point Base Uni Sync

  • 1.
    IME – InformatiqueMobile d’Entreprise PointBase UniSync Sébastien Letélié Ingénieur d’études et de développement [email_address]
  • 2.
    Plan de laprésentation PointBase Société produits PointBase UniSync Comment ça marche ? Publication Souscriptions Détection et résolution de conflits Exemples Conclusion
  • 3.
    PointBase Fondée en1998 par Bruce Scott, co-fondateur d’Oracle Le slogan : l’information partout où vous la voulez ! Ensemble de 4 produits destinés à gérer les données d’entreprise : 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 PointBase Embedded : un RDBMS 100% Java pour les applications embarquées (genre agenda), intégrant JDBC, les connections multiples sur la même JVM 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 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
  • 4.
    PointBase UniSync Permetde synchroniser des données entre des BDD compatibles JDBC C’est une API qui se situe à la frontière entre JDBC et l’application cliente 3 types d’API sont disponibles suivant les plates-formes JAVA (J2EE, J2SE, J2ME) Basé sur un modèle Publish/Subscribe client/serveur Les données qui transitent sont encryptées Utilise TCP/IP ou HTTP
  • 5.
    Comment ça marche? Le SyncDataSource représente l’accès à la base de donnée compatible Java Une classe SyncManager est appelée au démarrage pour configurer les SyncDataSource, les Hubs et les Spokes SyncDataSource Serveur SyncDataSource Client Une classe Hub coté serveur publie les tables synchronisables Une classe Spoke coté client souscrit à cette publication
  • 6.
    Publication Une publicationd’un Hub permet de diffuser Toutes les tables de la base Certaines tables Certaines tables avec un filtre Certaines colonnes de tables Chaque publication est nommée, et c’est par ce nom que les souscriptions se soumettent Le souscripteur ne peut synchroniser que sur les tables que la publication à diffusées
  • 7.
    Souscription Une souscriptiond’un Spoke permet Récupérer les tables publiées (getSnapshot()) Récupérer les modifications faites coté serveur (getPointUpdate()) Mettre à jour les modifications locales (putPointUpdate()) Combiner les 2 points précédents (sync()) Un Spoke est crée en déterminant l’URL d’accès au Hub (saveHubURL())
  • 8.
    Détection et résolutionde conflits (1) 4 types de conflits sont détectés : UPDATE_UPDATE : 2 clients mettent à jour sur le serveur une même ligne INSERT_INSERT : 2 clients insèrent une nouvelle ligne avec la même clé primaire UPDATE_DELETE : un client met à jour une ligne supprimée par un autre DELETE_UPDATE : un client supprime une ligne mise à jour par un autre Un conflit n’est pas détecté si le deux clients mettent à jour une information similaire 2 niveaux de résolution : Au niveau de la publication Au niveau d’une table
  • 9.
    Détection et résolutionde conflits (2) 4 types de résolution : CR_NONE : pas de détection de conflits, les mises à jour du client sont toujours valides CR_SPOKE_WINS : détection du conflit, c’est le client qui impose sa mise à jour CR_HUB_WINS : détection du conflit, c’est le serveur qui impose sa mise à jour User-Defined : détection du conflit et appel d’un classe spécifique pour le résoudre Exemples : Resolution de conflit au niveau publication : pub.setConflictResolver("CR_HUB_WINS") Resolution de conflit au niveau table : pub.setConflictResolver("PBPUBLIC.NameCard", "CR_HUB_WINS") Resolution de conflit défini par l’utilisateur : pub.setConflictResolver("PBPUBLIC.NameCard", "com.acme.MyConflictResolver")
  • 10.
    Exemples (1) Créationd’un Hub private static final String m_CDriver = "com.pointbase.jdbc.jdbcUniversalDriver"; private static final String m_CURL = "jdbc:pointbase://localhost:9092/hubdb"; private static final String m_CUser = "pbpublic"; private static final String m_CPassword = "pbpublic"; private static final String PUB = "Pub1"; private static final String HUBNAME = "Hub1"; 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[]{"SCOTT.TABLE1", "SCOTT.TABLE2"}; // 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.
    Exemples (2) Créationd’un Spoke associé private static final String m_SDriver = "com.pointbase.jdbc.jdbcUniversalDriver"; private static final String m_SURL = "jdbc:pointbase://localhost:9093/spokedb"; private static final String m_SUser = "pbpublic"; private static final String m_SPassword = "pbpublic"; private static final String PUB = "Pub1"; private static final String SUB = "Sub1"; private static final String SPOKENAME = "Spoke1"; private static final String m_HubURL = "tcp://localhost:8123"; 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 "SCOTT" String[] tableNames = l_DataSource.getAllTableNames("SCOTT"); // 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.
    Conclusion PointBase utiliseun ensemble de tables qui s’ajoute dans le schéma de base pour gérer la synchronisation 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 Les performances ont l’air d’être au rendez-vous, cependant cela reste à tester Un outil graphique permet de configurer les DataSource, les Hubs et les Spokes Cet outil répond cependant à un bon nombre de besoins liés à la mobilité Avec son modèle Publish/Subscribe, il est basé sur le même principe que la maquette AXIS/JMS de IME
  • 13.
    Contacts IMPROVE 74/80,rue Roque de Fillol 92800 PUTEAUX Tél. : 01.41.97.83.20 Mail : [email_address] URL : http://www.improve.fr Informations techniques http://www.application-servers.com « XML pour l’entreprise » (Livre blanc)