0

私はマルチスレッドプロジェクトに取り組んでおり、そこでcolumns使用するものをランダムに見つけてから、SELECT sqlそのSELECTsqlクエリを実行します。

それらの列を見つけた後-

  1. IDが有効範囲内にあるかどうかを確認する必要があります。有効範囲内にある場合は、columnsListからそれらの列を使用して結果セットをループし、データを取得して変数に格納します。
  2. それ以外の場合、idが有効な範囲内にない場合は、結果セットからデータが返されないことを確認する必要があります。しかし、どういうわけか、データを取得していて、プログラムを停止するためのフラグがtrueである場合は、プログラムを終了します。それ以外の場合、データを取得しているが、プログラムを停止するためのフラグがfalseの場合は、発生しているものの数を数えます。

以下は私のコードです-

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

問題文-

何が生成されるかに応じてSELECTSQLに異なる列が含まれるたびに、結果セットを反復処理する方法を理解できません。それとは別に、ifelseループでそれをよりクリーンにするにはどうすればよいですか。

4

2 に答える 2

1

OK ..ランダムに生成された列を文字列配列に保存してから、結果セットを反復処理するときにその配列を使用できます...次のようになります。UPDATEselect ステートメントにこれらの列を含めないでください。代わり
に すべてを選択する必要があります。*...を使用して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次
のように競合 状態を回避するために、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 に答える