Будут ли открытые соединения jdbc с сервером базы данных замедлять работу приложения? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть скрипт автоматизации для тестирования базы данных, который создает соединение с сервером БД и проверяет значения таблиц. Между тем приложение стало очень медленным. Есть ли какая-либо связь между открытыми соединениями и производительностью приложения?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Не обязательно. На самом деле, не ожидается, что открытые соединения будут замедлять работу приложения, если только это специально не оправдано .

На производительность могут влиять три фактора:

  • загрузка ЦП.
  • Занятие памяти.
  • Трафик ввода / вывода.

Должно ли соединение JDBC, просто для того, чтобы быть открытым, а не для использования, увеличить использование ЦП? В принципе нет, если драйвер не работает в фоновом режиме, какой-то своей собственной нити.

Должно ли оно занимать много памяти? В принципе нет, потому что API JDBC предназначены для восстановления данных через курсоры (он не должен занимать больше, чем простой рабочий буфер) - если драйвер не выполняет правильную сборку мусора из используемых udata.

Должно ли это делать много трафика ввода-вывода? В принципе нет, если только драйвер не выполняет опрос или что-то в фоновом режиме.

Итак, как видите, ответ таков: это зависит от реализации драйвера JCBC . Закрытие соединения, как только оно не используется, является хорошей практикой для освобождения ресурсов на стороне сервера, но обычно это не критично на стороне клиента.

0 голосов
/ 01 сентября 2018

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

Пул отслеживает использование / повторное использование / мультиплексирование соединений, не открывая и не закрывая их часто. Таким образом загрузка базы данных становится легче.

0 голосов
/ 29 августа 2018

Когда вы закончите с использованием своего Соединения, вам нужно явно закрыть его, вызвав его метод close(), чтобы высвободить любые другие ресурсы базы данных (курсоры, дескрипторы и т. Д.), К которым может удерживаться соединение.

   Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

    try {
        // Do stuff
        ...

    } catch (SQLException ex) {
        // Exception handling stuff
        ...
    } finally {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) { /* ignored */}
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) { /* ignored */}
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) { /* ignored */}
        }
    }

Всегда лучше закрыть объекты базы данных / ресурса после использования. Лучше закрыть объекты соединений, результатов и операторов в блоке finally.

До Java7 все эти ресурсы должны быть закрыты с помощью блока finally. Если вы используете Java 7, то для закрытия ресурсов вы можете использовать try-with-resources следующим образом.

try(Connection con = getConnection(url, username, password, "org.postgresql.Driver");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
) {

//statements
}catch(....){}
...