В JDBC метод setFetchSize(int)
очень важен для производительности и управления памятью в JVM, поскольку он контролирует количество сетевых вызовов из JVM в базу данных и, соответственно, объем оперативной памяти, используемой для обработки ResultSet.
По своей сути, если вызывается setFetchSize (10) и драйвер его игнорирует, вероятно, есть только две опции:
- Попробуйте другой драйвер JDBC, который будет учитывать подсказку размера выборки.
- Посмотрите на свойства драйвера в Соединении (URL и / или карта свойств при создании экземпляра Соединения).
RESULT-SET - это количество строк, распределенных в БД в ответ на запрос.
ROW-SET - это набор строк, которые выбираются из RESULT-SET за вызов от JVM к БД.
Количество этих вызовов и результирующее ОЗУ, необходимое для обработки, зависит от настройки размера выборки.
Так что, если RESULT-SET имеет 100 строк, а размер выборки равен 10,
будет 10 сетевых вызовов для извлечения всех данных, используя примерно 10 * {row-content-size} RAM в любой момент времени.
Размер выборки по умолчанию - 10, что довольно мало.
В опубликованном случае может показаться, что драйвер игнорирует настройку размера выборки, извлекая все данные за один вызов (большой объем оперативной памяти, оптимальный минимум сетевых вызовов).
Что происходит под ResultSet.next()
, так это то, что он фактически не выбирает по одной строке за раз из RESULT-SET. Он извлекает это из (локального) ROW-SET и извлекает следующий ROW-SET (незаметно) с сервера, когда он исчерпывается на локальном клиенте.
Все это зависит от драйвера, поскольку настройка - это всего лишь «подсказка», но на практике я обнаружил, что это работает для многих драйверов и баз данных (проверено во многих версиях Oracle, DB2 и MySQL).