память, выделенная драйвером jdbc для результата функции pl / sql - PullRequest
2 голосов
/ 02 марта 2012

Согласно документу " Oracle JDBC Memory Management " драйвер jdbc Oracle выделяет буфер char[] при анализе оператора.

Размер буфера рассчитывается исходя из максимально возможного размера данных строки, возвращаемых запросом.
Например, для оператора SELECT NAME FROM TAB, где NAME равно VARCHAR2(40), будет выделено 40 * 2 байта = 80 байтов.

Насколько большим будет буфер, если строка данных является функцией с возвращаемым значением varchar2? Например:

select FOO from dual;

где FOO

create or replace function FOO
return varchar2 is
...

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Я создал функцию

CREATE FUNCTION TEMP_ADAM_FUNC RETURN VARCHAR2 IS
BEGIN
  RETURN 'TEST';
END;

И я запросил ее следующим образом:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT TEMP_ADAM_FUNC FROM DUAL");
results.next();
results.getString(1);

После запуска этого через отладчик, вы можете видеть, что драйвер выделил значительную суммупамяти:

enter image description here

Фактически драйвер выделил 65535 символов для столбца VARCHAR2.

Я выполнил другой запрос:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT DUMMY FROM DUAL");
results.next();
results.getString(1);

Я подтвердил размер столбца DUMMY, используя этот запрос:

SELECT
  DATA_TYPE,
  DATA_LENGTH
FROM
  ALL_TAB_COLUMNS
WHERE
  TABLE_NAME = 'DUAL' AND COLUMN_NAME = 'DUMMY'

Этот запрос дал 'VARCHAR2' и 1 соответственно.

Однако в этом случае драйвер выделил 4096 символов:

enter image description here

Яне совсем уверен, что управляет этой логикой.

1 голос
/ 03 марта 2012

Немного отклонен по касательной от вашего вопроса ...

Как упоминалось на странице 5 белой бумаги, на которую вы ссылались, если вы можете использовать OracleStatement, тогда вы можете использовать defineColumnType для ограничения размера и, следовательно, объема памяти, зарезервированного для столбца.

Таким образом, вы можете указать меньший размер, чем по умолчанию, если размер не фиксирован, как в вызове вашей функции,или если вы возвращаете курсор ref;что может сэкономить значительный объем памяти (так как вы можете получить 32 КБ - или даже больше, основываясь на исследованиях Адама - умноженное на количество строк, которые вы предварительно выбираете).Вы также можете указать размер столбцов, размер которых вам известен, что может сохранить поездку в базу данных для тех, которые будут просматриваться при подготовке оператора.В любом случае, если вы установите слишком низкое число и получите столбец с более длинным значением, чем вы допустили, вы получите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...