在java中比较两个不同数据库的两个oracle表

tkqqtvp1  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(165)

我有两个不同的数据库。实际上,第二个数据库包含与第一个数据库相同的所有记录。这意味着当我在第一个数据库中创建/删除/更新任何条目时,过了一段时间,它在第二个数据库表中也是可见的。虽然有一些微小的差异,以及像两行是不同的或额外的第一个表。
我的问题是如何在java中比较来自两个不同数据库的这两个表。
我这样连接到数据库,但我不知道如何进一步进行。任何帮助都将不胜感激

String SQL_Statement = "SELECT * FROM Table_All_Customers";

        for (Connection con : getDBConnections())
        {

        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(SQL_Statement);
        int count=0;
        int rowCount= 0;
        while (rs.next())
        {
            count+=1;
            rowCount+=1;
            String productNumber = rs.getString("Customer");
            System.out.println("This is the result ... " + rowCount + " :" + productNumber);
        }
    }

使用上面的代码,我只是从这些表的列中获取数据并打印它们
table看起来像这样
数据库1中表1:

UserID  Customer    Order    number  
----------------------
2334e3    David       Pizza    2       
2334e4    David       Cola     3       
2334e5    Lisa        Cola     4       
2334e6     Lina       Pizza    5      
2334e7    Greco       Cola     6

db2 中表1:

UserID   Customer    Order    number  
    ----------------------  
  2334e3  David       Pizza    2       
  2334e4  David       Cola     3       
  2334e5  Lisa        Cola     4       
  2334e6  Lina        Pizza    5

我的目标是比较上面的两个表,以检查数据是否在两个不同的数据库中成功更新。还有什么办法可以检查差异吗?如何通过Java实现会感激任何帮助。
更新时间:
我尝试了类似的东西,但我无法比较差异,是否可以打印两个表之间的差异?

public static boolean isDBSame()
    {
        try
 {
        Connection con = DriverManager.getConnection(URL, userName, pass);
        Connection con2 = DriverManager.getConnection(URL2, userName, pass);
        Statement stmt = con.createStatement();
        Statement stmt2 = con2.createStatement();
        ResultSet rs = stmt.executeQuery(SQL_Statement);
        ResultSet rs2 = stmt2.executeQuery(SQL_Statement_2);
        int count = 0;
        int rowCount = 0;
        int firstDB_count = 0;
        int firstDB_rowCount = 0;
        List<String> tags = new ArrayList<String>();
        List<String> tags2 = new ArrayList<String>();
        List<String> tags3 = new ArrayList<String>();
        Set<String> ad = new HashSet<String>(tags);
        Set<String> bd = new HashSet<String>(tags2);
        while (rs.next())
        {
            String Customer = rs.getString(1);
            System.out.println("This is the content of 1st database: " + rowCount + " : " + Customer.toString());
            count += 1;
            rowCount += 1;
            tags.add(rs.getString("UserID"));
   while (rs2.next())
                {
String Customer2 = rs2.getString(1);
tags2.add(rs2.getString("CUserID"));
 }

        }
        for (String e : tags2)
        {
            System.out.println("This is the second database e.... " + e);
        }
        if (tags.equals(tags2))
        {
            System.out.println("Hi ");
            System.out.println("Content is same...");
            return true;
        }
        else
        {
            System.out.println("Content is not same and check properly....... " );
        }
    }
    catch (Exception e)
    {

        System.out.println("It is false...");
        System.out.println(e.toString());
    }
    return false;
}

连我都试过这个

Set<String> ad = new HashSet<String>(tags);
Set<String> bd = new HashSet<String>(tags2);
ad.removeAll(bd);

但它会导致假或真。我可以打印两个列表之间的差异吗?也有任何有效的方法来比较两个不同的数据库中的两个不同的表的不同列。

b5lpy0ml

b5lpy0ml1#

更方便的方法是在单个数据库中创建一个原始表,然后创建另一个具有类似特征的表,然后针对您的场景进行比较。
最简单的方法是在一个方法中创建两个单独的连接到您的2个数据库,如下所示:

public boolean isSame(){
        try{
           Connection con = DriverManager.getConnection(URL, userName, pass);
           Connection con2 = DriverManager.getConnection(URL, userName, pass);
           Statement stmt = con.createStatement();
           Statement stmt2 = con2.createStatement();
           ResultSet rs = stmt.executeQuery(SQL_Statement);
           ResultSet rs2 = stmt2.executeQuery(SQL_Statement);
              int count=0;
              int rowCount= 0;
              while (rs.next())
              {
                 while(rs2.next()){
                      String Customer = rs.getString(1);
                      String Customer2 = rs2.getString(1);
                      if(Customer.equals(Customer2)){
                          return true;
                      }
                 }
            }
       } catch(Exception e){
            System.out.println(e.toString())
     }
     return false; 
}

Con和Con2将是数据库的两个单独的连接,然后您可以为它们创建单独的语句和结果集。在获取值时,您将获得所需的值并比较它们,并且可以使用&&运算符一次比较多个值,这将解决您的问题。

alen0pnh

alen0pnh2#

你可以把你的代码组织得更好一点。例如,将你试图实现的目标分解为逻辑步骤。它比试错开发更有效:
1.从两个数据库中读取结果,按UserID排序
1.比较两个结果的行数和列数,如果不同,则退出并失败
1.同时迭代两个结果,直到有差异,或者到达两个列表的末尾。
1.在迭代中,从每个结果中取出下一行
1.循环访问两行的列
1.比较这两个列的值,如果它们不相等,则退出并失败
1.在到达结果迭代的末尾时,成功退出
类似这样(未经测试):

class DatabaseComparisonUtility {

    private ResultSet resultSet1;
    private ResultSet resultSet2;
    private int columnCount;
    private boolean equals;

    public boolean areSame(Database db1, Database db2, String query) throws Exception {
       
        equals = true;

        readResultSets(db1, db2, query);

        checkDimensions();

        while (equals && resultSet1.next() && resultSet2.next()) {
            compareRows();
        }

        return equals;
    }

    private void readResultSets(Database db1, Database db2, String query) throws Exception  {
        resultSet1 = readResultSet(db1, query);
        resultSet2 = readResultSet(db2, query);
    }

    private ResultSet readResultSet(Database db, String query) throws Exception  {
        Connection conn = DriverManager.getConnection(db.getUrl(), db.getUserName(), db.getPassword());
        Statement stmt = conn.createStatement();
        return stmt.executeQuery(query);
    }

    private void checkDimensions() {

        columnCount = getColumnCount(resultSet1):
        equals = equals && (columnCount == getColumnCount(resultSet2));

        int rowCount = getRowCount(resultSet1);
        equals = equals && (rowCount == getRowCount(resultSet2));
    }

    private int getColumnCount(ResultSet resultSet) {
         return resultSet.getMetaData().getColumnCount();
    }

    private int getRowCount(ResultSet resultSet) {
         resultSet.last();
         int rowCount = resultSet.getRow();
         resultSet.first();
         return rowCount;
    }

    private void compareRows() {
        for(int column = 1; column < columCount; column++) {                
            equals = equals && equalColumns(column);
        }
    }

    private boolean equalColumns(int column) {       
        String value1 = resultSet1.getString(column);
        String value2 = resultSet2.getString(column);
        equals = equals && (value1.equals(value2));
    }
}

我在这里假设可以比较列值的String表示,这在大多数情况下都应该是可以的。
equals = equals && (rowCount == getRowCount(resultSet2))这样的语句确保现有的equals值不会被覆盖。为了确保一旦equals变为false,随后的检查将不会使其再次为true。
部分rowCount == getRowCount(resultSet2)是一个布尔表达式,如果两个rowCount相等,则计算为true,否则为false。

相关问题