0

アプリケーションをリファクタリングしています。私が実際に行っていることの1つは、次のとおりです。

String sql = "select column1 from table2";
boolean isOrderbyAdded = false;
for(int i=1; i<N; i++) { // N is a known integer (e.g. 5)
    if(column[i]!=null) {
        if(!isOrderbyAdded) {
            sql += " order by "
            isOrderbyAdded = true;
        } else {
            sql += ", "
        }
        sql += column[i];
    }
}

これを準備文に変更したい。最終的に結果を並べ替える前に、各列名が指定されているかどうかを確認する 1 つのステートメントを作成する方法はありますか?

私のクエリは 1 日に何百万回も実行されます。準備されたステートメントを使用すると、コンパイル時間を節約できると思いました。

4

3 に答える 3

1

これは、基本的な SQL ライブラリを使用して行うことはできません。行き詰まっていますが、いくつかのオプションがあります。

  1. を使用String.formatすると、より高速になる場合があります。
  2. StringBuilderwith.appendを使用すると、間違いなく高速になります。
    • あまり頻繁に使用しない限り、s に+= を使用しないでくださいString(その場合は問題ありません)。StringBuilder特に井戸を予測できる場合は、常に高速ですcapacity。ただし、ここではデフォルトの 16 文字追加で十分である可能性があります (ただし、そうでない場合は、より大きな文字を使用してください)。
  3. おそらく、Spring を使い始めるのが一番早いでしょう。つまり、このソートクラスを使用します。

を使用するコードのバージョンを次に示しますStringBuilder。ただし、Spring の方法がおそらく最適ですが、さらに多くの作業が必要になります。ここで春をチェックしてください。

StringBuilder sqlsb = new StringBuilder("select column1 from table2");
boolean isOrderbyAdded = false;
for(int i=1; i<N; i++) { // N is a known integer (e.g. 5)
  if(column[i]!=null) {
    if(!isOrderbyAdded) {
      sqlsb.append(" order by ");
          isOrderbyAdded = true;
    } else {
      sqlsb.append(", ");
    }
    sqlsb.append(column[i]);
  }
}
String sql = sqlsb.toString();
于 2012-12-05T20:10:32.003 に答える
0

私のクエリは 1 日に何百万回も実行されます。準備されたステートメントを使用すると、コンパイル時間を節約できると思いました。

「コンパイル」とはどういう意味ですか? SQL 文字列を構築することを意味する場合、データベースと対話するコストが常に文字列構築を支配します (元のコードを 3 秒以内に 100 万回実行しました)。代わりに、コードのその部分を読み取り可能にすることを心配してください。

より重要な懸念事項は、クエリ プランが適切にキャッシュされるかどうかです。並べ替え順序の組み合わせごとに個別のキャッシュ エントリが使用されますが、適切にキャッシュされる可能性があります。並べ替え順序によって実行計画が変わる可能性があるため、これはそれほど奇妙ではありません。

于 2012-12-05T21:18:19.583 に答える
0

コードでは、SELECT 列が ORDER BY 列の候補です。

したがって、Java で半分の DB モデルを使用していて、より完全なモデルを使用しない場合は、mybatisのように XML で書き出された SQL ステートメントのプールを使用できます。SQL を収集し、テーブルごとにグループ化すると役立つ場合があります。

完全なモデルを目指します: JPA (たとえば eclipseLink を使用) では、クエリをタイプ セーフに構築するための基準 API があります。

ただし、従来のコードをリファクタリングしから、古いものをクリーンで保守可能にする必要があります。データクエリを表現から分割し、クエリの醜いネストされたループを削除し、同じテーブルでクエリを収集します。など。

はい、SQL インジェクションと引用符のエスケープのみであれば、準備済みステートメントを使用する方が優れています。

于 2012-12-05T20:31:38.560 に答える