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