Набор результатов JDBC закрыт - PullRequest
2 голосов
/ 24 марта 2010

Я выполняю профилирование моего Java-приложения и нашел интересную статистику для вызова jdbc PreparedStatement:

Ниже приведены подробности об окружающей среде: База данных: Sybase SQL Anywhere 10.0.1 Драйвер: com.sybase.jdbc3.jdbc.SybDriver пул соединений: c3p0 JRE: 1.6.0_05

Данный код указан ниже:

try {
    ps = conn.prepareStatement(sql);
    ps.setDouble(...);
    rs = ps.executeQuery();
              ......

    return xyz;
}
finally {
    try {
        if (rs != null) rs.close();
        if (ps != null) ps.close();
    }
    catch (SQLException sqlEx) {

    }
}

Из статистики JProfiler я обнаружил, что только этот конкретный оператор resultspace.close () занимает много времени. Он варьируется от 25 мс до 320 с, в то время как для других кодовых блоков, которые имеют одинаковую природу, я считаю, что это занимает около 20 микросекунд.

Просто чтобы быть уверенным, я несколько раз запускал этот тест производительности и подтверждал эти данные. Я озадачен этим поведением - Мысли?

Ответы [ 4 ]

3 голосов
/ 24 марта 2010

Это исполнение зависит от драйвера JDBC. Пул соединений C3P0 не должен иметь никакого влияния на него. Я бы предложил протестировать его с новым или другим драйвером JDBC. Альтернативой драйверу Sybase является драйвер jTDS . Я не уверен, как это работает по сравнению с драйвером Sybase, но известно, что он очень по сравнению с собственным драйвером Microsoft MSSQL JDBC.

Вне зависимости от конкретной проблемы, вы должны вызывать методы close() каждый в своем собственном блоке try, иначе нет гарантии, что они будут все закрыты. Если первое закрытие выдает SQLException, последующие вызовы закрытия не будут выполнены. Apache Commons DbUtils может помочь убрать стандартный код.

1 голос
/ 24 марта 2010

В смежной заметке отметьте Apache Commons DbUtils и Dbutils.closeQuietly () для простого управления закрытием соединений / операторов / наборов результатов в правильном порядке с правильная обработка исключений.

0 голосов
/ 24 марта 2010

Если выписка является оператором выбора, а вы не используете все данные, попробуйте отменить выписку до ее закрытия.

0 голосов
/ 24 марта 2010

Вызывает ли вызов метода фактическую загрузку процессора во время задержки или он просто ожидает? Закрытие ResultSet, скорее всего, связано с удаленным взаимодействием с базой данных, и я предполагаю, что в некоторых случаях это может занять некоторое время.

...