2011-06-18 71 views
-2
  1. 在下面的代碼中,當在循環內打印時,子哈希映射顯示正確的值,但是當在循環外部打印父哈希映射時,子哈希映射只顯示具有最後一個條目包含所有的值。將哈希映射放入另一個集合中的問題

    public void compareOracleMySQLData() throws SQLException { 
        String inputTableName = ConfigurationManager.getProperty("table_name"); 
    
        int i = 0; 
        int j = 0; 
        int colCount = 0; 
        int oracleRowCount = 0; 
        int mysqlRowCount = 0; 
        String primaryKeyIni = null; 
        String appendStuff = null; 
        Connection conO = DBManager.openDbConnection("mysql"); 
        Connection conM = DBManager.openDbConnection("mysql"); 
        Statement stmtO = null; 
        Statement stmtM = null; 
        ResultSet resultSetO = null; 
        ResultSet resultSetM = null; 
        ArrayList<String> primaryKeyList = new ArrayList<String>(); 
        Iterator<String> primaryKeyListItr = null; 
        HashMap<Object, Object> oraRowDetailsMap = new HashMap<Object, Object>(); 
        HashMap<String, Object> mysqlRowDetailsMap = new HashMap<String, Object>(); 
        Map<String, Object> oraRowPrimaryMap = new HashMap<String, Object>(); 
        HashMap<String, HashMap<String, Object>> mysqlRowPrimaryMap = new HashMap<String, HashMap<String, Object>>(); 
    // Map<String, Object> oraRowPrimaryMap=new HashMap<String, Object>(); 
    // Map<String, Object> mysqlRowPrimaryMap=new HashMap<String, Object>(); 
        try { 
         if (conO != null && conM != null) { 
          if (validateTableStatus(inputTableName, conO, conM)) { 
           // Check table existence in Oracle and Mysql Database 
    
           // Create resultset for oracle 
           stmtO = conO.createStatement(
             ResultSet.TYPE_SCROLL_INSENSITIVE, 
             ResultSet.CONCUR_READ_ONLY); 
           resultSetO = stmtO.executeQuery(DB_QUERY); 
           ResultSetMetaData rsMetaDataO = resultSetO.getMetaData(); 
    
           // 
    
           // MySql details for the same table created 
           stmtM = conM.createStatement(
             ResultSet.TYPE_SCROLL_INSENSITIVE, 
             ResultSet.CONCUR_READ_ONLY); 
           resultSetM = stmtM.executeQuery(DB_QUERY); 
    
           // Get Column Count for two tables 
           ResultSetMetaData rsMetaDataM = resultSetM.getMetaData(); 
           logger.debug("Column Count in Oracle table ::" 
             + rsMetaDataO.getColumnCount()); 
           logger.debug("Column Count in Mysql table ::" 
             + rsMetaDataM.getColumnCount()); 
           // Match Column count of two tables 
           if (rsMetaDataM.getColumnCount() == rsMetaDataO 
             .getColumnCount()) { 
            logger.debug("The Column count in both table are same"); 
            oracleRowCount = getRowCount(inputTableName, resultSetO); 
            mysqlRowCount = getRowCount(inputTableName, resultSetM); 
            logger.debug("No of Rows of Oracle Table :: " 
              + oracleRowCount); 
            logger.debug("No of Rows of Mysql Table :: " 
              + mysqlRowCount); 
            if (oracleRowCount != mysqlRowCount) { 
             logger 
               .debug("The number of rows of Oracle and Mysql tables respectively differs"); 
    
            } 
    
    
    
            else { 
             primaryKeyList = getPrimaryKey(inputTableName, conO); 
    
             while (resultSetO.next()) { 
    
              i = 0; 
              primaryKeyListItr = primaryKeyList.iterator(); 
              while (primaryKeyListItr.hasNext()) { 
    
               if (i == 0) { 
                primaryKeyIni = (resultSetO 
                  .getObject(primaryKeyListItr 
                    .next().toString())) 
                  .toString().trim(); 
    
    
               } else { 
                appendStuff = (resultSetO 
                  .getObject(primaryKeyListItr 
                    .next().toString())) 
                  .toString().trim(); 
                primaryKeyIni = primaryKeyIni + "$" 
                  + appendStuff; 
    
               } 
               i++; 
    
              } 
    
              // 
    
              colCount = rsMetaDataO.getColumnCount(); 
              for (j = 1; j <= colCount; j++) { 
               System.out.println("Col Name"+rsMetaDataO 
                 .getColumnName(j)); 
               System.out.println("Col Value"+ resultSetO 
                 .getObject(rsMetaDataO 
                   .getColumnName(j))); 
               oraRowDetailsMap.put(rsMetaDataO 
                 .getColumnName(j), resultSetO 
                 .getObject(rsMetaDataO 
                   .getColumnName(j))); 
              } 
               System.out.println("primaryKeyIni"+primaryKeyIni); 
              System.out.println("oraRowDetailsMap inside loop"+oraRowDetailsMap); 
              oraRowPrimaryMap.put(primaryKeyIni, 
                oraRowDetailsMap); 
        } 
        System.out.println("oraRowDetailsMap"+oraRowDetailsMap);System.out.println(oraRowPrimaryMap); 
    
          } 
    
           } else { 
            logger.debug("The number of Columns of Oracle and Mysql table differs"); 
           } 
    
          } 
         } 
        } 
    
        catch (SQLException e) { 
         logger.debug("Error in CompareOracleMySQLData()" + e.getMessage()); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } finally { 
         DBManager.closeConnection(conO); 
         DBManager.closeConnection(conM); 
         DBManager.closeStatement(stmtO); 
         DBManager.closeStatement(stmtM); 
         DBManager.closeResultSet(resultSetO); 
         DBManager.closeResultSet(resultSetM);}} 
    

2.輸出低於::

     DEPLOYMENT_LEVEL is: DVL 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to  MYSQL database established 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Connection to  MYSQL database established 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Oracle table ::4 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - Column Count in Mysql table ::4 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - The Column count in both table are same 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Oracle Table :: 3 
DEBUG com.tsh.compass.intranet.dao.DbDao 18 Jun 2011 23:06:39 IST. - No of Rows of Mysql Table :: 3 
Col NameFirst_Name 
Col Valuefn 
Col NameLast_Name 
Col Valueln 
Col NameAddress 
Col Valueadr 
Col NameCity 
Col Valuecity 
primaryKeyInifn$ln 
oraRowDetailsMap inside loop{Address=adr, Last_Name=ln, First_Name=fn, City=city} 
Col NameFirst_Name 
Col Valuefn1 
Col NameLast_Name 
Col Valueln1 
Col NameAddress 
Col Valueadr1 
Col NameCity 
Col Valuecity1 
primaryKeyInifn1$ln1 
oraRowDetailsMap inside loop{Address=adr1, Last_Name=ln1, First_Name=fn1, City=city1} 
Col NameFirst_Name 
Col Valuefn3 
Col NameLast_Name 
Col Valueln3 
Col NameAddress 
Col Valueadr3 
Col NameCity 
Col Valuecity3 
primaryKeyInifn3$ln3 
    oraRowDetailsMap inside loop{Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3} 
    oraRowPrimaryMap{fn3$ln3={Address=adr3, Last_Name=ln3, First_Name=fn3,  City=city3}, fn$ln={Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}, fn1$ln1=  {Address=adr3, Last_Name=ln3, First_Name=fn3, City=city3}} 
+8

牆上的代碼omg –

+3

請嘗試編碼一個簡單的例子。 – Matthias

+0

什麼是孩子,什麼是父親哈希圖?我想這可能是mysqlRowPrimaryMap,但它不會在任何地方使用,是嗎? – merxbj

回答

0

你只需要重用的每一行相同oraRowDetailsMap。難怪你的結果一遍又一遍地重複着同一張地圖。

在結果集循環中使用Map<...> oraRowDetailsMap = new HashMap<...>();爲每行創建一個新映射,而不是在循環之前創建一個新映射。

+0

感謝PaŭloEbermann.That解決了它。 – Joy