Я перебираю ResultSet в Java; который для целей тестирования возвращает около 30 строк с 17 столбцами (все строковые данные) на строку. Я вручную создаю XML-строку из результатов с помощью StringBuilder, и цикл буквально занимает около 36 секунд, чтобы завершить эти итерации.
Примечание. Я понимаю, что это не лучший способ получить XML из базы данных или даже лучший способ получить XML из ResultSet, но мне все равно любопытно, что медленная производительность.
Обновление: В соответствии с ответами на данный момент я должен решить следующее: время выполнения запроса составляет менее секунды, и я выполнял 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";
}
Обновление: Учитывая полученные мной предложения, этот код занимает примерно столько же времени плюс-минус полсекунды.
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
}
Обновление: Как и предполагалось, я закрою этот вопрос, так как заголовок не отражает направление, в котором возникла проблема.
StringBuilder
. Попробуйте удалить все, что упоминаетStringBuilder
, и оставить только циклы и вызовыgetColumnName()
иgetString()
. - person Joachim Sauer   schedule 02.02.2010