problem with putting hash map into another collection
In the below code the child hashmap when printed within loop shows correct value but when the parent hashmap is printed outside the loop the child hashmap is showing a map with only the values of last entry overiding all the values开发者_如何学运维.
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.The output is below ::
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}}
You are simply reusing the same oraRowDetailsMap
for each row. No wonder you have the same map over and over in your result.
Use a Map<...> oraRowDetailsMap = new HashMap<...>();
inside your result set loop to create a new map for each row, instead of only once before the loop.
精彩评论