Где хранится набор результатов при работе с драйвером jdbc и oracle - PullRequest
10 голосов
/ 23 ноября 2011

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

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

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

Ответы [ 4 ]

9 голосов
/ 23 ноября 2011

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

РЕДАКТИРОВАТЬ 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 голосов
/ 23 ноября 2011

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

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

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

0 голосов
/ 16 июля 2018

Я получил это из документации Oracle JDBC:

Размер выборки

По умолчанию, когда Oracle JDBC выполняет запрос, он получает набор результатов. 10 строк за раз от курсора базы данных. Это по умолчанию Значение размера выборки строки Oracle. Вы можете изменить количество строк извлекается при каждой поездке в базу данных курсором путем изменения строки значение размера выборки. Стандартный JDBC также позволяет указывать номер строк, извлекаемых при каждом обращении к базе данных для запроса, и это число называется размером выборки. В Oracle JDBC Значение строки предварительной выборки используется в качестве размера выборки по умолчанию в выражении объект. Установка размера выборки отменяет настройку предварительной выборки строки и влияет на последующие запросы, выполняемые через этот объект оператора. получать Размер также используется в наборе результатов. Когда объект оператора запускает В запросе размер выборки объекта оператора передается результату. установить объект, созданный запросом. Тем не менее, вы также можете установить выборку размер в объекте набора результатов, чтобы переопределить размер выборки оператора это было передано ему.

https://docs.oracle.com/cd/E11882_01/java.112/e16548.pdf

р. 17-4

0 голосов
/ 23 ноября 2011

После выполнения запроса данные возвращаются в JVM. JVM обрабатывает все операции ввода-вывода данных с этого момента.

...