2013-02-27 27 views
0

我正在開發一個多線程項目,我需要隨機找到columns,我將在我的SELECT sql中使用該數據,然後我將執行該SELECT sql查詢。循環結果集取決於生成的列數

尋找那些columns-

  1. 我需要看到的ID是否有效範圍之間,如果在有效範圍內之間,然後周圍的結果集循環中使用這些列從columnsList並獲得後數據返回並存儲在一個變量中。
  2. 否則,如果id不在有效範圍內,我需要檢查我沒有從結果集中取回任何數據。但不知何故,如果我得到的數據返回和標誌是真的停止程序,然後退出程序。否則,如果我得到的數據回來,但標誌是假的停止該程序,然後計數有多少這些發生。

下面是我的代碼 -

private volatile int count; 

@Override 
public void run() { 

..... 

final String columnsList = getColumns(table.getColumns()); 
.... 
rs = preparedStatement.executeQuery(); 
.... 
if (Read.endValidRange < id && id < Read.startValidRange) { 

    while (rs.next()) { 
     for(String column: columnsList.split(",")) { 
      System.out.println(column + ": " + rs.getString(column)); 
     } 
    } 
} else { 
    if(rs.next() && Read.flagTerminate) { 
     System.exit(1); 
    } else { 
     count++; 
    } 
} 

.... 

} 

/** 
* A simple method to get the column names in the order in which it was 
* inserted 
* 
* @param columns 
* @return 
*/ 
private String getColumns(final List<String> columns) { 
    List<String> copy = new ArrayList<String>(columns); 
    Collections.shuffle(copy); 

    int rNumber = random.nextInt(columns.size()); 

    List<String> subList = copy.subList(0, rNumber); 
    Collections.sort(subList, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      return columns.indexOf(o1) < columns.indexOf(o2) ? -1 : 1; 
     } 
    }); 
    return StringUtils.join(subList, ","); 
} 

問題聲明 -

我不能夠理解我應該如何通過ResultSet,我將有不同列每次迭代我的SELECT sql取決於生成的內容。除此之外,我怎樣才能讓它在if循環中變得更清潔。

+0

我的工作中,我需要隨機發現我需要列一個項目在我的SELECT SQL中使用,然後我將執行該查詢。 - 什麼? – Woot4Moo 2013-02-27 19:52:50

+0

'否則,如果我得到的數據回來,但標誌是錯誤的停止該程序,然後計數有多少這些發生。「你在說什麼事情? – 2013-02-27 20:25:03

+0

'否則,如果我得到的數據回來,但標誌是假的停止程序,然後數出有多少人已經發生。通過這個我試圖說只是計算這些潛在的情況。當程序結束時,然後從主線程打印出來。就這樣。 – AKIWEB 2013-02-27 20:26:37

回答

0

OK .. 你可以有隨機生成的列保存在一個字符串array..and然後同時通過迭代結果集您使用數組...如下: UPDATE
你不應該包括那些列在選擇statement..Instead您應該選擇使用*在SELECT語句中的所有列...然後獲取該列在rs.next()循環的價值...

rs = con.executeQuery("Select * from tablename"); 
while(rs.next()) 
{ 
    for (String col : columnsList) 
    { 
    System.out.print(rs.get(col)); 
    } 
    System.out.print("\n"); 
} 

UPDATE1
您需要在產品運行中寫你的關鍵代碼段()被包裹在synchronized塊,以避免競爭條件如下:

private volatile int count; 

@Override 
public void run() { 

..... 
while (!Read.flagTerminate) 
{ 
    synchronized(this) 
    { 
     if (!Read.flagTerminate) 
     { 
      String columnsList = getColumns(table.getColumns()); 
      .... 
      rs = preparedStatement.executeQuery(); 
      .... 
      if (Read.endValidRange < id && id < Read.startValidRange) 
      { 
       while (rs.next()) 
       { 
        for(String column: columnsList.split(",")) 
        { 
         System.out.println(column + ": " + rs.getString(column)); 
        } 
       } 
      } 
      else 
      { 
       while (rs.next()) 
       { 
        count++; 
       } 
      } 
     } 

    } 
} 
System.exit(0);//it implies that flag = true; 

.... 

} 

/** 
* A simple method to get the column names in the order in which it was 
* inserted 
* 
* @param columns 
* @return 
*/ 
private String getColumns(final List<String> columns) { 
    List<String> copy = new ArrayList<String>(columns); 
    Collections.shuffle(copy); 

    int rNumber = random.nextInt(columns.size()); 

    List<String> subList = copy.subList(0, rNumber); 
    Collections.sort(subList, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      return columns.indexOf(o1) < columns.indexOf(o2) ? -1 : 1; 
     } 
    }); 
    return StringUtils.join(subList, ","); 
} 
+0

謝謝維沙爾,這很有道理。我的第二點問題呢?它現在看起來非常難看,因爲我已經做了很多次循環。更可能的更清潔的方式? – AKIWEB 2013-02-27 20:05:32

+0

從未經處理的輸入漏洞安全漏洞 – Woot4Moo 2013-02-27 20:08:43

+0

@ Woot4Moo:對不起......你能解釋你的評論!!!嗎? – 2013-02-27 20:11:18

0

這個怎麼樣:

if (Read.endValidRange < id && id < Read.startValidRange) { 
    while (rs.next()) { 
     for (String column : columnsList.split(",")) { 
      System.out.println(column + ": " + rs.getString(column)); 
     } 
    } 
} else if (rs.next()) { 
    if (Read.flagTerminate) { 
     System.exit(1); 
    } else { 
     count++; 
    } 
} 

我也更新瞭如果其他條件按我的問題的理解。

+0

所以它應該在'while(rs.next()){'loop right? – AKIWEB 2013-02-27 20:02:32

+0

是的,沒錯。 – 2013-02-27 20:03:06

+0

謝謝Nishant。這就說得通了。我的第二點問題呢?我目前的做法是,如果設置其他循環,它看起來非常難看。任何更乾淨的方法呢? – AKIWEB 2013-02-27 20:06:20