Access , java

Sami991 Messages postés 2 Date d'inscription mercredi 12 août 2015 Statut Membre Dernière intervention 16 août 2015 - 12 août 2015 à 14:04
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 16 août 2015 à 17:11
Bonjour ,

je possede deux bases de donnée access voluminueses conetenant plusieurs tables et les deux bases sont semblable juste ilya diffrence au niveau quelque valeurs .
donc je voulais comparaer entre les deux bases .

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
Modifié par KX le 15/08/2015 à 16:47
Bonjour,

Quand tu parles de bases de données volumineuses, on parle de quelle volumétrie par table ?

Si la plus grosse table ne contient que quelques centaines de Mo maximum, tu dois pouvoir t'en sortir en traitant tout en mémoire, sinon il faudra utiliser une troisième base de données pour stocker les données temporaires.

Voici une idée de code qui fait tout en mémoire (je n'ai pas testé).

Il faut modifier les quatre premières lignes pour configurer le driver, les connexions aux deux bases et les tables à comparer.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class CompareDatabase {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Class.forName(...);
        Connection conn1 = DriverManager.getConnection(...);
        Connection conn2 = DriverManager.getConnection(...);
        String[] tables = {...};

        for (String table : tables) {
            Set<List<String>> data1 = readAll(conn1, table);
            Set<List<String>> data2 = readAll(conn2, table);
            List<List<String>> tmp = new ArrayList<>(data1);
            data1.removeAll(data2);
            data2.removeAll(tmp);

            System.out.println("Valeurs uniques pour la table " + table);
            System.out.println("Dans la base 1 : " + data1);
            System.out.println("Dans la base 2 : " + data2);
            System.out.println();
        }
        
        conn1.close();
        conn2.close();
    }

    public static Set<List<String>> readAll(Connection conn, String table) throws SQLException {
        Statement stmt = conn.createStatement();
        stmt.executeQuery("select * from " + table);
        ResultSet rs = stmt.getResultSet();
        rs.setFetchSize(1000);
        int columns = rs.getMetaData().getColumnCount();

        Set<List<String>> set = new TreeSet<>(new ListComparator<String>(true, true, true));
        while (rs.next()) {
            List<String> list = new ArrayList<String>(columns);
            for (int i = 1; i <= columns; i++)
                list.add(rs.getString(i));
            set.add(list);
        }

        rs.close();
        stmt.close();
        return set;
    }

    public static class ListComparator<E extends Comparable<E>> implements Comparator<List<E>> {

        private final boolean bothNonNull;
        private final boolean bothSameSize;
        private final boolean allContentNonNull;

        public ListComparator(boolean bothNonNull, boolean bothSameSize, boolean allContentNonNull) {
            this.bothNonNull = bothNonNull;
            this.bothSameSize = bothSameSize;
            this.allContentNonNull = allContentNonNull;
        }

        @Override
        public int compare(List<E> list1, List<E> list2) {
            if (!bothNonNull) {
                if (list1 == null) {
                    if (list2 == null)
                        return 0;
                    else
                        return -1;
                } else if (list2 == null) {
                    return 1;
                }
            }
            if (!bothSameSize) {
                int n = Integer.compare(list1.size(), list2.size());
                if (n != 0)
                    return n;
            }
            for (int i = 0, size = list1.size(); i < size; i++) {
                E e1 = list1.get(i);
                E e2 = list2.get(i);
                if (!allContentNonNull) {
                    if (e1 == null) {
                        if (e2 != null)
                            return -1;
                    } else if (e2 == null) {
                        return 1;
                    }
                }
                int n = e1.compareTo(e2);
                if (n != 0)
                    return n;
            }
            return 0;
        }
    }
}

J'ai essayé d'optimiser un peu, mais ça risque d'être un traitement assez long si tu as vraiment beaucoup de données.
La confiance n'exclut pas le contrôle
0
Sami991 Messages postés 2 Date d'inscription mercredi 12 août 2015 Statut Membre Dernière intervention 16 août 2015
16 août 2015 à 16:55
bonjour ,
comment je peux tester ce code avec la classe main
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
16 août 2015 à 17:11
Comme je l'ai mis :

"Il faut modifier les quatre premières lignes pour configurer le driver, les connexions aux deux bases et les tables à comparer. "

Après tu compiles et tu exécutes... il faudra peut-être corriger deux ou trois trucs si ça marche pas.
0
Rejoignez-nous