база данных Oracle JDBC, версиях до 12:
Драйвер выделяет максимальный размер для каждого столбца раза количество строк в fetchSize
перед выполнением запроса.
Например, для столбца VARCHAR(4000)
он выделяет 8k байтов в fetchSize
.
версии 12 (и выше):
он выделяет примерно 15 байт в колонке на строку в fetchSize
перед выполнением запроса. После выполнения драйвера в версии 12 выделяется столько, сколько необходимо для хранения фактических данных строки.
В результате драйверы версии 12 обычно используют значительно меньше памяти, чем драйверы более ранних версий.
Ваш пример:
В вашем например VARCHAR(20)
может быть столь же большой, как 40 байтов, NUMBER
может быть как 22 байт и VARCHAR(100)
, как большой, как 100 байт. С fetchSize
, установленным в 100 старших драйверов, будет выделено (40 + 22 + 100) * 100 = 16k
. Драйвер версии 12 выделил 3 * 15 * 100 = 4.5k
.В обоих драйверах есть дополнительные накладные расходы, которые я игнорирую.
[Смотреть это] (HTTP: //stackoverflow.com/questions/8234087/where-result-set-is-stored-while-working-with-jdbc-and-oracle-driver). Насколько я знаю, выделенная память в куче Java никогда бы не превышала фактического количества строк. [См. Также этот раздел] (http://stackoverflow.com/questions/6651250/resultset-memory) –