Java で ResultSet をループしています。テスト目的で、1 行あたり 17 列 (すべて文字列データ) の約 30 行を返します。StringBuilder を使用して結果から手動で XML 文字列を作成していますが、ループがこれらの反復を完了するのに文字通り約 36 秒かかります。
注: これは、データベースから XML を取得するための最良の方法ではなく、ResultSet から XML を取得するための最良の方法でさえないことを認識していますが、とにかくパフォーマンスが遅いことに興味があります。
更新:これまでの回答によると、次のことに対処する必要があります: クエリを実行する時間は 1 秒未満であり、これを絞り込むためにコードのすべてのセクションの前後に System.currentTimeMillis() を実行しました。36 秒は、以下のコード内に完全に含まれています。
ResultSetMetaData rsmeta = rset.getMetaData();
StringBuilder resultBuilder = new StringBuilder();
resultBuilder.append("<?xml version=\"1.0\" ?><ROWSET>");
if(numColumns != 0){
while (rset.next()) {
resultBuilder.append("<ROW>");
for (int i = 0; i <= numColumns -1;i++) {
columnName = rsmeta.getColumnName(i+1);
resultBuilder.append("<");
resultBuilder.append(columnName);
resultBuilder.append(">");
resultBuilder.append(rset.getString(i+1));
resultBuilder.append("</");
resultBuilder.append(columnName);
resultBuilder.append(">");
}
resultBuilder.append("</ROW>");
numRows += 1;
}
}
else {
stmt.close();
wsConn.close();
return "No Results";
}
更新:私が受け取った提案を考えると、このコードには、0.5 秒とほぼ同じ時間がかかります。
StringBuilder resultBuilder = new StringBuilder();
resultBuilder.append("<?xml version=\"1.0\" ?><ROWSET>");
if(numColumns != 0){
while (rset.next()) {
resultBuilder.append("<ROW>");
for (int i = 0; i <= numColumns -1;i++) {
//columnName = rsmeta.getColumnName(i+1);
resultBuilder.append("<");
resultBuilder.append("TestColumnName");
resultBuilder.append(">");
//resultBuilder.append(rset.getString(i+1));
resultBuilder.append("TestData");
resultBuilder.append("</");
resultBuilder.append("TestColumnName");
resultBuilder.append(">");
}
resultBuilder.append("</ROW>");
numRows += 1;
}
}
else {
stmt.close();
wsConn.close();
return "No Results";
}
他のすべてを排除して行った最後のテストは、 while テストを現実的な反復回数 (160、以前に行った小さなテストから返された最大行数) に置き換えることでした。ここで問題となるのは、このような速度低下の原因は、この結果セットについて何であるかということです。
while (numRows <= 160) {
// same as above
}
更新:タイトルが問題の方向性を反映していないため、この質問を終了します。