Bonjour à tous,
[Historique et contexte, vous pouvez zapper jusqu'à QUESTION en dessous]
Je précise que je suis débutant dans les BDD, j'ai récupéré la mise à jour d'un logiciel utilisant des bases de données, SQlite en Local, sur plusieurs postes et Oracle ou MySQL sur un serveur.
Les postes doivent pouvoir fonctionne en autonome sans le serveur, et des que le serveur est présent ils synchronise les données. il peut y avoir une grosse quantité de données, notamment des mesures en permanence relevé par des appareils connectés aux postes.
Il est compliqué voir impossible de changer la structure des bases malheureusement, les système peuvent évoluer mais les anciens doivent pouvoir marcher sur le même serveur.
Voila pour le contexte.
Ont a constaté que les conflits de concurrence étaient très nombreux, lors des synchronisations entre le serveur et les bornes avec des crash dù au non respect des clefs secondaire, des pertes de données ou des doublons impossible normalement.
Par exemple le même appareils de mesure avec plusieurs relevé identique, dont la date de démarrage et la fin, ce qui est impossible. Bref ont essaye de colmaté tout cela.
L'un des points étant d'optimisé les envoies des données actuellement très longue.
On a fait des testes avec deux table, TB1 et TB2 plus de 30000 lignes dans TB1, et 350 000 ligne dans TB2. TB1 étant principalement la date de début et fin, ainsi que le numéro de l'appareil, TB2 étant les mesures. Entre les 2 j'ai des clés secondaires et primaires, la clef secondaire de TB2 rappelant la primaire de TB1.
Historique
Pour Oracle ce qui était fait:
Il n'y avait pas d'auto-incrémente de l'ID...Donc:
1) Demande du Max(ID) de TB1
2) Création de la requête d'insertion avec le Max(ID) + 1
3) Envoie de la requête dans TB1.
4) Utilisation de ce Max(ID)+1 pour la clef secondaire dans la TB2
et pour TB2 pareil en insérant donc le Max(ID) +1 précèdent.
Bonjour la concurrence possible.
Ce que nous avons fait:
Rajouter des triggers pour l'Auto-Increment dans oracle, avec la prise en charge et correction éventuel de l'ID s'il est inséré (des anciens postes).
Puis:
1) Création de la requête sans l'ID pour TB1,
2) Un select pour la récupération de l'ID suivant ce que je viens d'insérer (même matériel, même date de début et fin). Et plus un MAX (ID) dangereux.
3) Passer l'ID A TB2 pour sa clé secondaire etc etc..
4) Je met à jour la base local (qui est en SQlite) avec l'ID distant et la date de la mise à jour dans mes 2 tables local.
Cela n'empêche pas les anciens système de fonctionner, mais de planter puisqu'il ne récupère pas l'ID après l'insertion et considère que le max(id) est toujours bon. TB2 risque de ne pas avoir la bonne clef. Enfin bref le sujet de ma question n'est pas là.
Mais problème, cela met plus de 2 heures pour faire les Updates des tests avec les 30 000 lignes de TB1 et 350 000 de TB2.
[QUESTION]
Pour changer la façons de faire et d'envoyer une grosse quantité de données d'un seul coup, J'ai trouvé pour Oracle, cela:
Existe t'il la même chose en MySQL?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 OracleConnection Connection; public void ExecuteWriteAllData(DataTable insertDT) { string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + serveur_name+ ")(PORT=" + oraclePort + ")) (CONNECT_DATA=(SERVICE_NAME=" + database_name + "))); User Id=" + user_name + ";Password=" + password + ";"; Connection= new OracleConnection(connectionString); using (var bulkCopy = new OracleBulkCopy(Connection, OracleBulkCopyOptions.UseInternalTransaction)) { bulkCopy.DestinationTableName = table; bulkCopy.WriteToServer(insertDT); } Connection.Close(); }
Le but étant d'envoyer la totalité des requetés sur TB1, puis récupérer TB1, filtrer éventuellement avec la plage des dates, dans une DataTable.
Recherche dans cette Datatable les ID puis les créer une seconde Datatable à envoyer dans Oracle / ou MySQL ainsi que la mise à jour dans SQlite local.
L'envoie des 350 000 lignes dans Oracle grâce avec cette méthode au dessus n'est que de quelques secondes
Merci
Partager