Recordset multiple INSERT vers serveur MySQL

Tibo06530 Messages postés 11 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 10 janvier 2011 - 16 juin 2010 à 10:03
Tibo06530 Messages postés 11 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 10 janvier 2011 - 16 juin 2010 à 17:32
Mesdames, Messieurs, Bon jour!
Si l'un ou l'une d'entre vous peut m'aider ce serait pour moi... formidable.
Aussi je vous remercie de vous soucier de mon problème(ce qui est le cas puisque vous me lisez)
Merci tous.

Le problème: 1er emploi et premier post sur un forum et premier VRAI problème
Donc

J'aimerais sauvegarder une DB mySQL d'un serveur sur un autre et tout ca en VB6.
Voici donc le code que j'ai écrit:


    Dim Query_In As String
    Dim Query_Del As String
    Dim conn_src As ADODB.Connection      'Connexion vers serveur Source
    Dim conn_dst As ADODB.Connection      'Connexion vers serveur destination
    Dim rs As ADODB.Recordset             'Recordset ou stocker temporairement les données à sauvegarder

    bit_red = True     'Deviendra faux quand il n'y aura plus de donnée à sauvegarder dans la DB source
    
    Set conn_src = MySQL_Conn(IP_source, "gpsdb", "gpsdb", "gpsdb")  'Ouverture connexion avec la base de données source
    If conn_src.State = 0 Then                                       'Tests pur confirmer ouverture de la connexion
        erreur_msg = erreur_msg & "_ Connection error to DB Source"
        Exit Sub
    End If

    'Sélection des données les plus anciennes à auteur de maximum 1000 lignes sinon... surcharge au niveau de la boucle de traitement du recordset
    Query_source = "SELECT * FROM f2e WHERE time_sys < CURRENT_DATE - INTERVAL " & Save_delay & " DAY ORDER BY 2 ASC LIMIT " & Max_row

    Do While bit_red = True    'Boucle de traitement des données 1000 ligne à la fois. quand Query_source ne retournera plus rien bit_red sera Faux

        Set rs = New ADODB.Recordset       'Declaration du recordset
        rs.CursorLocation = adUseClient    'avec option UseClient pour ne pas surcharger le serveur source
        rs.Open Query_source, conn_src     'execution de la requete Query_source Select

        If rs.RecordCount > 0 Then
            rs.MoveFirst
        
            Set conn_dst = MySQL_Conn(IP_destination, "gpsdb", "gpsdb", "gpsdb")   'Ouverture connexion avec la base de données destination
            If conn_dst.State = 0 Then                                             'Test de connexion OK
                erreur_msg = erreur_msg & "_ Connection error to DB Destination"
                Exit Sub
            End If
        
            Do         'A mon avis c'est la qu'il faut changer un truc mais si vous avez d'autres solutions...

                If rs.Fields(3) "Cnx" Or rs.Fields(3) "Pos" Then
                    Query_In = QuerySave_All(rs.Fields(1), rs.Fields(2), rs.Fields(3), rs.Fields(4), rs.Fields(5), rs.Fields(6) _
                                            ,rs.Fields(7), rs.Fields(8), rs.Fields(9), rs.Fields(10), rs.Fields(11), rs.Fields(12))
                Else
                    Query_In = QuerySave_Part(rs.Fields(1), rs.Fields(2), rs.Fields(3), rs.Fields(4), rs.Fields(5), rs.Fields(6))
                End If

                conn_dst.Execute (Query_In)   'Exécution de l'INSERT pour 1 SEULE ligne (il y en a plusieurs MILLION)
            
                'Suppression dans la base source de la sauvegarde effectuée précédemment
                Query_Del = "DELETE FROM `f2e` WHERE `id`='" & rs.Fields(0) & "'"
                conn_src.Execute (Query_Del)
            
                rs.MoveNext
                Sleep 7         'Evite au cpu de tourner comme un fou
                DoEvents        'Evite à l'appli de rester bloquée     MAIS pas assez efficace pour un perfectionniste comme moi

            Loop Until rs.EOF = True
        
            conn_dst.Close
            Set conn_dst = Nothing
        Else
            bit_red = False
        End If

        rs.Close
        Set rs = Nothing
        Sleep 13              'Evite encore au cpu de devenir fou
        DoEvents              'Evite encore au PC de croire que l'appli est folle
    Loop



Mon problème est qu'une fois mon Recordset plein de données (notez dans la requête Query_source que j'ai du ajouter une limit au nombre de ligne sélectionner, sinon ca peut monter à 8 millions de ligne voir plus)
Ma boucle Loop until recordset.EOF bouffe tout le cpu et l'appli ne répond plus... Problème!!!
Le DoEvents et le sleep(7) arrange un peut les choses mais rien de très pro ni efficace (pour 8 millions de lignes ca prendrais des jours et en faisant rien d'autre, j'ai déjà fait de nombreux test et j'en suis à quelques centaines en 10-15 minutes et c'est pas suffisant)

Par hasard ou autre raison...
Auriez vous une solution pour faire un INSERT du Recordset complet en une fois via ma deuxième connexion "conn_dst"
Je me demande aussi si une fois mon Recordset utilisé avec la connexion conn_src je peut ensuite le réutiliser avec une autre connexion ou le recordset est il lié à la connexion une ois utilisé ensemble?

SVP svp, je vous en prie. Jusqu'à aujourd'hui je me suis pas trop mal débrouillé mais la ca commence a faire un moment que je suis dessus et rien de bien concret jusqu'à ce jour.
Does someone has an idea??? Please? HELP !

Merci a vous tous.
Tibo

PS: j'espère avoir été à peut près clair dans ma/mes questions, pas trop verbeux ni grossier... et surtout ne m'être trompé de forum pour le sujet.
Encore merci à tous

1 réponse

Tibo06530 Messages postés 11 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 10 janvier 2011
16 juin 2010 à 17:32
Super!!!! en cherchant sur le net je tombe sur ma propre question...
0
Rejoignez-nous