0

我正在开发一个多线程项目,我需要在其中随机找到columns将在我的项目中使用的项目SELECT sql,然后我将执行该 SELECT sql 查询。

找到那些列后-

  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, ",");
}

问题陈述-

我无法理解我应该如何遍历结果集,因为每次我的 SELECT sql 中都会有不同的列,具体取决于生成的内容。除此之外,我怎样才能使它在 if else 循环中更干净。

4

2 回答 2

1

好的..您可以将随机生成的列保存在字符串数组中..然后在通过结果集迭代时使用该数组...如下: 更新
您不应该在选择语句中包含这些列..相反,您应该选择所有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");
}

更新1
您需要将您在 run() 中编写的关键代码部分包装在同步块中,以避免出现竞争条件,如下所示:

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, ",");
}
于 2013-02-27T20:02:47.450 回答
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++;
    }
}

根据我对问题的理解,我还更新了 if-else 条件。

于 2013-02-27T20:01:14.427 回答