2016-07-05 708 views
0
List patternList=new ArrayList<String>(); 
ResultSet rs=stat.executeQuery("select file_pattern from Pattern_table"); 
while(rs.next()){ 
    sourcePattern=rs.getString(1); 
    patternList.add(sourcePattern); 
} 

ここでは、各レコードを調べて、listに追加します。 ResultSetをトラバースし、listにレコードを追加するには時間がかかりすぎます。ResultSetオブジェクトをArrayListに変換する方法

ResultSetのすべてのレコードをlistに一度に追加する別の方法はありますか?

さらに、パフォーマンスを向上させるために私が従うことのできる方法はありますか?

+1

このループを高速化するためにJava側から行うことはほとんどありません(おそらく、 'ArrayList'をpresizeしますが、それについてです)。そして、私は実際には、パフォーマンスの問題はここから来ているのではないかと疑います。私は、このコードが遅い場合は、避けられないもの( 'rs.next()')のデータベース側が原因であることを示しています。より速いクエリを書くことができ、しかし、あなたは 'rs.next()'の何らかの形以外のものを反復する方法がありません。プロファイルを作成して、実際にどこの時間が費やされているかを確認する必要があります(Javaコードが遅い、データベースからのI/Oを待つ時間など)。 – GPI

+0

可能であれば、ループする要素が少なくなるように、条件を使用してデータをフィルタ処理してみてください。残念ながら、ResultSetは反復のみ可能です。 – Vektor88

+0

JDBCを直接使用する必要はありますか?代わりにJPAを試してください。 – Stefan

答えて

1

ResultSetオブジェクトは、 データの現在の行を指すカーソルを維持します。最初は、カーソルは最初の行の前に配置されます。 次のメソッドはカーソルを次の行に移動し、ResultSetオブジェクトにそれ以上行がない場合は falseを戻すため、結果セットを反復処理するwhileループでは を使用できます。

要するに、結果セットから直接リストを取得する方法が見つかったとしても、そのリストを使用してリストに変換するためのイテレーションが常に使用されます。

1

いつもCommons DbUtilsMapListHandlerを使用できます。ドックから:

ResultSetHandlerの実装では、ResultSetをMapsのリスト に変換しているので、多くの定型的なコードが手に取られます。 それ以外はデータベースのトランザクション時間に依存します。

0

これをアーカイブするにはmany utilsがありますが、パフォーマンスが大幅に向上するのはデータベース接続と実行したSQL文にあり、最適化する必要があります。

0

メソッドgetArray(String columnLabel)を使用してresultSetから列の値を取得し、配列に格納できます。 要件に応じてarrayListに変換してください。 例:

List patternList=new ArrayList<String>(); 
ResultSet rs=stat.executeQuery("select file_pattern from Pattern_table"); 
String[] tempArr = rs.getArray(file_pattern); 
patternList = Arrays.asList(tempArr); 
1

最初のいくつかのSQLクライアントから同じクエリを実行しようとするJavaコードのパフォーマンスを改善しようとする前に。 SQLクライアントから取得した時間がJavaに等しいかどうかを確認します。

SQLクライアントでは、一度にフェッチする行数にデフォルトの制限があるため、実行に費やされた時間を測定するためにクエリが返すすべての行をフェッチしていることを確認する必要があります。

あなたはSQLクライアントは、Javaの呼び出しよりもかなり速く実行されていることが判明した場合、彼らはStatementまたはResultsetfetchSize()を設定してみてください。

https://docs.oracle.com/cd/A87860_01/doc/java.817/a83724/resltse5.htm

ResultSetクエリからのデータ全体が、それのほんの一部ではありません。 resultSet.next()を実行すると、以前にフェッチされた行がなくなると、行をフェッチし続けます。

たとえば、クエリが5000行を返し、fetchSizeが100の場合、result.next()は一度に100行をフェッチします。これらの100行が読み取られた後でのみ、データベースへの次の呼び出しが行われます。JDBCはデータベースへのネットワーク呼び出しを5000/100=50にします。

+0

おかげさまでパフォーマンスが向上しましたfetchSize –

関連する問題