Где набор результатов сохраняется при работе с драйверами jdbc и oracle

Как только я использую jdbc с драйвером oracle и запускают запрос выбора, результат запроса хранится на сервере памяти oracle или файловой системы или таблицы temp?

и как только я запустил следующий метод, получив следующую строку, он загружается из памяти сервера oracle в память jvm?

И в случае, если я определяю, что размер размера выборки в наборе результатов равен 1000, означает, что 1000 строк загружаются из оракула в JDBC-драйвер JVM?

Ответ 1

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

РЕДАКТИРОВАТЬ 1:

Вы можете видеть, сколько строк ваш набор результатов извлекает за один раз, выполнив это (пожалуйста, проверьте синтаксис):

rs.beforeFirst(); // will put cursor before the first row
rs.last(); // will put cursor after the last line
int noOfRows = rs.getRow(); // will give you the current row number

ИЗМЕНИТЬ 2:

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

Ответ 2

В зависимости от точной реализации часть набора результатов будет предварительно загружена в JVM, и часть ее будет либо находиться в памяти сервера Oracle, либо будет просто загружена из базы данных при запросе большего количества строк.

При выполнении запроса база данных не всегда должна считывать все строки перед возвратом данных клиенту (в зависимости от пути доступа к запросу, способности оптимизатора, функциональности db и т.д.).

Когда вы устанавливаете fetchSize() в Statement, вы даете только подсказку драйверу JDBC, насколько вы думаете, что он должен предварительно выбирать. Драйвер JDBC может игнорировать вас. Я не знаю, что делает драйвер Oracle с помощью функции fetchSize(). Наиболее известный AFAIK - это (или, возможно, был) драйвер JDBC MySQL, который всегда будет извлекать все строки, если вы не установите fetchSize() в Integer.MIN_VALUE.

Ответ 3

После выполнения запроса данные возвращаются в JVM. JVM обрабатывает все данные ввода/вывода с этой точки.