Et voilà la dernière session de la PDC, enfin la session que j’attendais depuis le début (j’exagère à peine) En même temps on se garde le meilleur pour la fin :)

Présenté par Marc Scurell, Lead PM sur le sujet. Le but de la présentation est biensur de nous présenter SQL Azure Data Sync sorti le jour du KeyNote (bon ça a fait moins de bruit que la sortie de SL4 beta, je vous l’accorde volontiers !)

Basé sur le Sync Framework V2 , Marc nous fait un tour d’horizon du framework, avec pas mal de théorie, intéressant pour ceux qui n’ont pas suivi mes webcasts et articles ;)

imageimage

SQL Azure Data Sync

image

Le Wizard qui va permettre de connecter une base de données locale avec SQL Azure, avec une base de données local SQL SERVER 2008.

Tout se passe par le wizard, qui va créer toute l’architecture sur SQL AZURE, parfait réplica de la base locale. A noter que le tracking des changements se fait via le Change Tracking de SQL SERVER 2008, mais j’ai pu voir encore des tables supplémentaires contenant des métadatas encore nécessaires pour faire fonctionner le tout.

 

 

image

Vient ensuite une démo de synchronisation entre SQL AZURE et SQL SERVER CE. Ce qu’est sympa c’est que le template VS pour SQL CE va générer via son wizard non seulement la première synchronisation mais aussi le code nécessaire pour reproduire une synchronisation complète en .NET

Du coup la synchro entre une base de données sql ce et sql azure se résume en 1 ligne !

image

Pour aller plus loin; on peut meme imaginer des scénarios 3 Tiers, avec de la logique métier officiant entre les bases de données locale et les bases SQL Azure :

image

 

Synchronisation avec un client Silverlight

Une démo très très sympa vient conclure ma PDC, une synchronisation entre SQL Azure et un client Silverlight (où je vous rappelle nous n’avons PAS ADO.NET et encore moins la possibilité d’accéder à une base Compact)

Le principe est donc de synchroniser la base SQL Azure avec l ‘IsolatedStorage local disponible depuis SL :

image Ca, ça m’a bien bluffé, ils ont écrit le SyncProvider spécial pour l’IsolatedStorage. Espérons qu’ils le fourniront en sample :)

Pour finir la roadmap de Sync Framework : On s’oriente vers début 2010 avec la sortie du Sync Framework V2.1 avec le full support Azure et la V3 en cours d’année.

image

Voilà la PDC c’est fini pour cette année, et contrairement à l’année passée, aucune prochaine date n’a été annoncée, on va donc je pense revenir à un cycle plus classique de 3 ou 4 ans avant la prochaine PDC !

J’en profite au passage pour remercier Laurent de Techheadbrothers et Thomas de Microsoft qui m’ont permis d’assister cette année à ce grand évènement. Merci !

, ,

Et voilà, la session n’est pas encore donnée (elle aura lieu Jeudi) mais déjà la CTP de SQL DATA Sync est disponible !

Je reviendrais dessus rapidement mais voici déjà l’annonce sur le Blog de la team Sync :

http://blogs.msdn.com/sync/archive/2009/11/17/announcing-sql-azure-data-sync-november-ctp-available-for-download.aspx

CA, ça roxe !

,

Et voilà la version RTM de Sync Framework 2.0 est sortie.

Vue d'ensemble de Sync Framework 2.0
Sync Framework 2.0 développe les fonctions offertes par Sync Framework 1.0 :

  • Ajoute des fonctionnalités qui répondent aux besoins de nouveaux scénarios ou de scénarios qui étaient difficiles à prendre en charge.
  • Facilite le travail lié au développement de fournisseurs.
  • Prend en charge davantage de sources de données avec de nouveaux fournisseurs intégrés.

Les principales nouvelles fonctionnalités et améliorations incluses dans Sync Framework 2.0 sont les suivantes :
Dans les composants principaux :

  • Fournisseurs simples : facilitent le travail lié au développement de fournisseurs, particulièrement lorsque la source de données a très peu de fonctions liées à la synchronisation, par exemple le suivi des modifications.
  • Filtrage flexible : les filtres d'unité de modification et les filtres personnalisés ont été ajoutés aux composants de fournisseurs personnalisés. Ces filtres, en plus des filtres d'élément de Sync Framework 1.0, vous permettent de filtrer vos données de la façon qui vous convient le mieux. 
  • Gestion des conflits améliorée : d'autres scénarios de conflits sont pris en charge, tels que le signalement des conflits de contraintes, la gestion des conflits enregistrés et la résolution des conflits à l'aide d'une stratégie de type « le dernier enregistreur gagne ».
  • Conversion de données entre des fournisseurs : dans certains scénarios, les fournisseurs de synchronisation synchronisent le même type de données (par exemple, les données de vente), mais les formats de données requis par chaque fournisseur peuvent être différents. Pour répondre aux besoins de ce scénario, Sync Framework vous permet d'implémenter des interfaces qui convertissent les données au format requis par chaque fournisseur.
  • Service d'application de modifications : augmente la souplesse et l'utilité du composant applicateur de modifications de Sync Framework.
  • Suivi : vous permet d'effectuer le suivi de l'exécution de plusieurs composants, ce qui s'avère utile pendant le débogage d'applications. 

Dans les fournisseurs de bases de données :

  • Nouveaux fournisseurs de bases de données (SQL Server et SQL Server Compact) : permettent une synchronisation d'égal à égal et hub-and-spoke pour SQL Server, SQL Server Express et SQL Server Compact. Sync Framework crée automatiquement toutes les commandes requises pour communiquer avec chaque base de données. Vous n'avez pas à écrire des requêtes de synchronisation comme vous le faites avec d'autres fournisseurs. Les fournisseurs prennent en charge les options d'initialisation flexible, le traitement par lot de modifications selon la taille des données et les tâches de maintenance, telles que le nettoyage des métadonnées et la restauration de la base de données serveur.
  • Traitement par lot basé sur la mémoire fiable : les versions précédentes de Sync Framework et Sync Services for ADO.NET ont offert un moyen aux développeurs de définir leur propre logique de traitement par lot, mais les limitations étaient nombreuses.
  • API d'approvisionnement et de gestion : les activités d'approvisionnement et d'initialisation précédemment exposées uniquement via les outils Visual Studio ont maintenant été ajoutées aux API de fournisseur de bases de données.
  • Améliorations des performances : dans cette version, les nouveaux fournisseurs de bases de données ont été méthodiquement testés dans des scénarios à grande échelle dans lesquels un serveur unique prend en charge des milliers de clients avec des centaines d'opérations de synchronisation simultanées. 

Pour plus d'informations sur les nouvelles fonctionnalités, consultez « Nouveautés dans Sync Framework 2.0 » dans la documentation qui est installée avec le Kit de développement logiciel (SDK) Sync Framework ou cliquez sur le lien Nouveautés dans Sync Framework 2.0

Il existe dans SQL SERVER CE un système de tracking des changements.

Il est utilisé dans la réplication SQL SERVER 2005 – 2008 tout comme dans le framework Sync Services for ADO.NET

Seulement ce système de change tracking n’est PAS accessible pour nous pauvre développeurs non Microsoft (c’est balot)

A chaque demande “Donnez nous l’accès au Change Tracking sur Sql Server CE”, la réponse était immanquablement “Euh … non, vous en avez pas besoin, dites nous votre problème, on vous montrera comment s’en passer”

Frustrant ….

Aujourd’hui bonne nouvelle, au détour d’un vieux Post qui date de l’année dernière dans mon anglais incertain où je demandais (supplier :) ) cette feature, Sean Kelly, Program Manager de Sync Services et SQL Server Compact, annonce la disponibilité de cette fonctionnalité dans une future release de Visual Studio 2010 !

Bonne nouvelle du jour, donc.

,

Aujourd’hui, je vais répondre à un problème récurrent concernant les synchronisations d’un serveur SQL SERVER 2005 (2008) avec le change tracking activé.

D’où vient cette erreur ?

De temps en temps, votre synchronisation échoue et vous renvoie l’erreur suivante :

SQL Server Change Tracking has cleaned up tracking information 
for table Client. 
To recover from this error, 
the client must reinitialize its local database and try again'

Le problème vient de la période de rétention des données (notamment supprimées) sur le serveur :

image

Supposons que vous n’ayez pas synchronisé votre application pendant une période de 7 jours. Il se peut donc que certaines données à supprimer sur votre application soient puremment et simplement non disponibles sur le serveur car celui ci a nettoyer ces données.

Votre application se retrouverait donc non correctement synchronisée.

Sync Services envoie avant chaque synchronisation, l’ancre de dernière synchronisation, une sorte de “marque” qui enregistre votre dernière synchronisation. Il stocke cette information et l’envoie via le paramètre @sync_last_received_anchor.

A chaque fin de synchronisation, Sync Services récupère une nouvelle ancre générée via l’instruction :

Select @sync_new_received_anchor = CHANGE_TRACKING_CURRENT_VERSION()

Et avant chaque synchronisation il demande au serveur de vérifier cette fameuse ancre. Si celle-ci est incorrecte, une exception SqlServer est levée :

IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Client')) > @sync_last_received_anchor 
RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. 
To recover from this error, the client must reinitialize its local database and try again', 
16, 
3,  
N'dbo.Client')  

Solution

J’ai une application de type Synchronisation via un service WCF.

Voici un schéma de la solution de départ :

image

Je suis donc dans une solution relativement classique, utilisant WCF pour se connecter au serveur.

Voici un schéma récapitulatif de l’architecture de mes projets sous VS :

image

L’erreur provient du Serveur SQL. C’est lui qui connait la dernière date de synchronisation possible et la dernière date de synchronisation du client en cours.

Il va nous falloir “catcher” l’erreur et la renvoyer au client, lui demandant de resynchroniser totalement son application.

Voici l’ordre d’exécution:

  1. Tentative de synchronisation du client. Envoie des infos nécessaires au serveur
  2. Récupération coté serveur de la demande. Levé de l’exception, pour cause de “ça fait trop longtemps que t’es pas venu te synchroniser vilain”. Renvoie de l’erreur au client
  3. Récupération de l’erreur coté client. Nettoyage de la base de donnée locale, en vue d’une resynchro complète. Demande de resynchro.
  4. Récupération coté serveur d’une demande de synchro complète. Envoie des données au client

Coté Serveur

Premièrement, il nous faut récupérer l’erreur coté client. Il est donc important d’indiquer à WCF que les erreurs doivent être remontées sur le client.

Je marque donc la classe héritant de mon interface avec un ServiceBehavior particulier

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public partial class DonutSyncSyncService : object, IDonutSyncSyncContract
{
    private DonutSyncServerSyncProvider _serverSyncProvider;
 
    public DonutSyncSyncService()
    public virtual SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession)
    public virtual SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession)
    public virtual SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession)
    public virtual SyncServerInfo GetServerInfo(SyncSession syncSession)
}

Nous allons maintenant récupérer l’erreur générée par SQL SERVER :

Dans chaque corps de méthode (ApplyChanges, GetChanges, GetSchema, GetServerInfo) je rajoute le code suivant (je prends pour exemple ApplyChanges, le code est indentique pour la partie Catch, sur les autres méthodes)

public virtual SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession)
{
    try
    {
        return this._serverSyncProvider.ApplyChanges(groupMetadata, dataSet, syncSession);
    }
    catch (SyncException se)
    {
        if (se.ErrorNumber == SyncErrorNumber.StoreException)
        {
            SqlException sqlExcept = se.InnerException as SqlException;
 
            if (sqlExcept != null && sqlExcept.Class == 16 && sqlExcept.State == 3)
            {
                throw new ApplicationException("ChangeTrackingCleanedUp", se);
            }
        }
        throw se;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Vous noterez que pour récupérer l’erreur correcte, je vérifie 3 choses :

  1. L’erreur est une SyncException : C’est bien une erreur générée par Sync Services.
  2. L’innerException est une SqlException : C’est au départ une erreur levée par Sql Server
  3. La Class et le State de l’erreur sont respectivement 16 et 3 (données générées par le RAISERROR des instructions de synchronisations)

Une fois récupérée, je génère une erreur simple à comprendre coté client, coté le mot clé “ChangeTrackingCleanUp”.

Coté Client

Il va me falloir, coté client, récupérer cette erreur et la traiter correctement:

  1. Récupérer l’erreur contenue dans une CommunicationException
  2. Récupérer le message indiquant “ChangeTrackingCleanUp”
  3. Réinitialiser la base de donnée cliente pour une synchro totale.
  4. Relancer la synchro (aprés demande ou non à l’utilisateur)

Comment marquer la base de données locale pour une synchro Totale ?

  1. Vous écrasez la base de donnée locale
  2. Vous effacez les informations de synchronisations de chaque table

Dans le premier cas, vous perdez toutes les informations des tables. Pas grave me direz vous, si vous refaites une synchro totale. SAUF si votre utilisateur a saisi des données supplémentaires entre temps. Dans ce cas là elle sont perdues.

Dans le deuxième cas, les tables sont marquées pour synchro totale, mais les dernière modifications et insertions sont tout de même envoyées au serveur.

Comment marquer une table pour synchro complète . En indiquant sont LastReceivedAnchor à null:

sqlCeProvider.SetTableReceivedAnchor(st.TableName, new SyncAnchor());

Je me suis fait une petite méthode qui lance une synchro avec réinitialisation ou non des tables, comme suit :

public SyncStatistics Synchronize(bool reinit)
{
    if (!reinit)
        return base.Synchronize();
 
    SqlCeClientSyncProvider sqlCeProvider;
    sqlCeProvider = (SqlCeClientSyncProvider)this.LocalProvider;
 
    foreach (SyncTable st in this.Configuration.SyncTables)
    {
        if (st.SyncDirection != SyncDirection.Snapshot)
        {
            sqlCeProvider.SetTableReceivedAnchor(st.TableName, new SyncAnchor());
        }
    }
 
    return base.Synchronize();
}

Il ne reste plus qu’à lancer la synchro, vérifier les erreurs et relancer si nécessaire :

DonutSyncSyncContractClient proxy = new DonutSyncSyncContractClient("WSHttpBinding_IDonutSyncSyncContract");
DonutSyncSyncAgent myAgent = new DonutSyncSyncAgent(proxy);
SyncParameter param = new SyncParameter("@OwnerEmployeId", DonutSettings.Default.EmployeId);
myAgent.Configuration.SyncParameters.Add(param);
 
try
{
    var stats = myAgent.Synchronize(false);
}
catch (TargetInvocationException ex)
{
    if (ex.InnerException != null && ex.InnerException.Message == "ChangeTrackingCleanedUp")
    {
        try
        {
            var stats = myAgent.Synchronize(true);
 
        }
        catch
        {
            // Serious Error need to be catched here
        }
 
    }
}
 

Voilà votre application est resynchronisée correctement.

Bonne synchro !

La version CTP2 de Sync Framework 2 vient de voir le jour.

Première bonne nouvelle, on peut ENFIN installer la version Sync Framework 2 en side by side avec la version 1, ce qui n’était pas le cas avec la CTP1.

Bref, au niveau des nouveautés :

Un provider Complet pour SQL Server. Aprés moult demandes de la part des utilisateurs, l’équipe Sync Framework intègre enfin en natif un provider SQL SERVER basé sur le provider Peer to Peer.

Nouvelles API’s pour générer automatiquement les instructions SQL de synchronisation.

Batching amélioré et automatisé sur les providers SQL et SQL CE

Snapshot Initialisation : Pouvoir répliquer un snapshot complet sur SQL Server CE ( Ca, ça poutre ! )

Amélioration des performances du provider SQL Server CE : Ca il était temps ;) Espérons qu’ils ont enfin poolé les connections CE, et passé par des instructions d’insertion optimisé.

Pour une description complète, je vous conseil le blog de Liam C.

Bref, que du bon, à tester trés vite ! (J’y vais fingerscrossed)

Alors, suite à mon précédent post, sur l’annonce de la refonte de SDS, une petite news sur Huron.

Pour rappel, le projet Huron, développé par la team Sync Framework a pour ambition de proposer un Fx de synchro entre votre base de données “In the Cloud” et une base de données clients Sql Server (CE, Express ou 2005/2008)

Ca faisait un petit moment que je me demandais pourquoi nous n’avions aucune news / CTP de Huron alors que lors de la PDC Liam nous annonçait que nous aurions de quoi faire avant fin 2008 (hum ..hum…)

Et bien tout s’explique.
Huron profitera bien sûr de cette évolution (pour ne pas dire révolution) majeure de SDS, pour synchroniser vos bases locales.
Pour tout dire, les développeurs de Huron ont déjà travaillé sur un prototype utilisant déjà le futur nouveau standard de SDS. Pour plus d’informations sur le sujet, rendez vous sur un post complet sur le blog de Liam

Bref, du bon gros lourd à venir, espérons que nous aurons bientôt de quoi faire mumuse avec. Mais n’attendez rien avant la fin de l’année concernant Huron. Be Patient !

Et voilà, ma session sur Sync Services est terminée.

SyncServicesADONET

Tout s’est “relativement” bien passé, le public présent avait l’air très intéressé par le sujet. J’en profite d’ailleurs pour vous remercier d’y avoir participé.

Bon on a quand même frôlé la catastrophe, car 2h avant je n’étais pas sûr d’arriver à temps ! (Oui la tempête tout ça tout ça …)

Au sujet de la session, malheureusement je n’ai pas pu montrer tout ce que j’avais prévu, on imagine pas comment 1 H ça passe vite, quand on fait une présentation !

De tout façon, les slides ainsi que les démos seront bientôt “online” sur le site des TechDays 2009.

Et une petite dernière chose, pour ceux qui étaient là, j’ai eu un bug au cours de ma démo sur WCF. A l’exécution, une veille erreur de fichier de configuration (que j’avais pourtant copié – collé, et donc préparer à l’avance) est venue un peu gâcher la fête…

Bon ce matin, de bon pied bonne humeur, j’ai quand même chercher à comprendre pourquoi.

Et bien tout simplement (sic) j’avais nommé mon proxy généré “ServerSyncProvider” et mon fichier XML de configuration que j’avais préparé à l’avance contenait un Binding sur le contrat “SyncServerProvider

C’est balot …

Et voilà comme quoi, on a beau préparer et re préparer, on est pas à l’abri d’une couffe de ce genre hein !

Bon, à ma décharge (faut bien que je trouve une excuse hein ;) ) je venais de me taper 12h de train avec 2 ronfleurs professionnels dans le train couchette, ça aide pas à avoir les idées claires :)

Sur ce, je retourne faire quelques sessions aujourd’hui, mais en tant que spectateur aujourd’hui !

tdspeakermsfv9 Petite promo. pour la session que j’anime au TechDays de cette année :

Sync Services for ADO.NET

Au menu cette année, les nouveautés Sync Services for ADO.Net, avec notamment le support de Sql Server 2008 et du Change Tracking, ou encore l’utilisation de Sync Services sur un PDA.

Nous élaborerons ensemble une application complète (en 1 h !) qui permettra de consulter nos données déconnectées, que nous soyons sur un Desktop ou sur un PDA.

Bien sur, et comme dans la vraie vie, nous aurons aussi à gérer les conflits pouvant survenir entre un ou plusieurs mobiles cherchant à éditer ou supprimer les même données.

Et tant qu’à faire, nous utiliserons les outils d’aujourd’hui, WPF, WCF, SQL SERVER 2008, SQL SERVER COMPACT 3.5 sp1, WINDOWS CE 6.

Et si nous avons le temps, une petite surprise en fin de session, que vous n’êtes pas prét de voir ailleurs !

,

Steve Lasker vient d'écrire un superbe post récapitulant pas mal de posts, démos et slides sur Sql Server Compact et Sync. Services.

http://blogs.msdn.com/stevelasker/archive/2008/11/25/demos-presentations-links-screencasts-and-videos-for-sql-server-compact.aspx

Je vous conseille particulièrement la démo sur le gain de performance avec Sql Server Compact, avec un "simili" pool de connection et cache de commandes.

C'est assez bluffant..

SQL Server Compact Bulk Insert Performance Test Harness (Compares Compact & Express)

Vous avez un screencast sur cette partie, qu'il a présenté lors de la PDC 2008.

https://sessions.microsoftpdc.com/public/timeline.aspx (Faites une recherche sur Sql Server Compact, la session s'appelle Sql Server Compact : Embedding in desktop and device applications)

image

Sur le screenshot précédent, l'application de test qui génère des insertions en base de données (Sql Server CE)

On fait un test entre une méthode vraiment "cracra" où on crée, ouvre, ferme la connexion et la commande sur chaque ligne importée et une version "plus mieux" où la connexion est réutilisée et la commande mis en cache

Résultat sans appel :

  1. 1ere méthode : 6 Transactions / seconde
  2. 2eme méthode : 6000 Transactions / seconde

Vous trouverez aussi dans la solution fournie un exemple d'assembly qui gère une sorte de pool de connexion ,via une Queue, et une collection de command mises en cache.

,