JDBC — групповые операции

Много запросов с помощью Batch-метода

В реальных проектах часто возникает ситуация, когда вам необходимо сделать очень много однотипных запросов (наиболее частов в этом случае встречается PreparedStatement) — например надо вставить несколько десятков или сотен записей. Если вы будете выполнять каждый запрос отдельно, то это будет достаточно долго и производительность вашего приложения будет невысокой. Для повышения производительности вы можете использовать batch-режим вставки. Он заключается в том, что вы накапливаете некоторый буфер своими запросами, а потом выполняете их сразу. В качестве примера приведу кусочек кода:

В принципе вот и все — ничего сверхсложного там нет. Могу только посоветовать не увлекаться и не вставлять больше нескольких сотен запросов за раз и обратить внимание, что executeBatch возвращает массив целых чисел (попробуйте сами догадаться, что он значит — в качестве подсказки посмотрите, что возвращает executeUpdate).
Также есть смысл посмотреть на работу getGeneratedKeys() — если вы уже забыли, что это такое — посмотрите предыдущую статью.

Много запросов в одном Statement

Вторым достаточно любопытным способом повысить производительность может быть выполнение сразу нескольких разных SQL-запросов. В качестве примера можно посмотреть следующий код.

Как видите, мы в одну строку поместили ДВА SQL-запроса — один SELECT и один DELETE. После этого мы выполняем метод execute(), который возвращает true, если первое возвращаемое значение является ResultSet или false — если это был запрос на модификацию.
Для перехода к результату исполнения следующего запроса вызывается метод getMoreResults()он также возвращает true в случае, если следующий результат является типом ResultSet или false — это значит, что либо SQL-запрос выполнял модификацию, либо больше результатов нет. Чтобы выбрать между этими двумя вариантами надо обратиться к методу getUpdateCount. Если возвращается 0 и больше — значит выполнялся запрос на модификацию. Если результат равен -1 — значит больше запросов нет.

И наконец, полный текст примера для обоих случаев — покопайтесь в нем самостоятельно. Обратите внмание на более лаконичную конструкцию для try с ресурсами. Она появилась в java 1.7 = думаю, самое время вам понять, что и как там происходит. (в общем ничего сложного — ресурс автоматически закрывается)

Сам проект можно скачать здесь — BatchExampleDb.zip

Что осталось за кадром

Сейчас не могу сказать, будет ли этот раздел по базам данных в Java заключительным, но пока планирую именно так — впереди только наш замечательный пример с контактами. Какие возможности и особенности есть у JDBC еще, вы можете посмотреть сами. Мы еще много чего не разбирали:

  • работа с BLOB (binary large object)
  • вызов процедур через интерфейс CallableStatement
  • модификация ResultSet
  • использование RowSet с его расширениями.
  • создание и использование собственных типов данных
  • работа с массивами
  • работа с XML

В общем, я оставляю на вашу собственную голову достаточно широкий спектр вопросов. Весьма неплохое руководство можно посмотреть на сайте Oracle здесь: Trail: JDBC(TM) Database Access.

И теперь нас ждет следующая статья: Список контактов — работаем с БД