Поддержка Spring JDBC и большой набор данных

При использовании одного из различных шаблонных методов JDBC я не понимаю, как перебирать / прокручивать большие наборы результатов (которые выиграливписывается в память). Даже без прямого представления интерфейса Iterable я бы по крайней мере ожидал, что экземпляры RowCallbackHandler будут вызваныв то время как запрос выполняется не после негоs закончено (или переполнение кучи).

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

База данных Oracle10g. Я использую драйвер 11.1.0.7.0-Production и Spring 2.5.6.SEC01. Любые идеи кто-нибудь, как перебрать наборы результатов, предпочтительно при сохранении логики отображения RowMapper и т. Д.?

Ответы на вопрос(5)

Решение Вопроса

setFetchSize() метод наjava.sql.Statement, который позволяет вам контролировать, сколько строк драйвер будет извлекать за один раз.

Тем не мение,RowMapper как используется Spring работает, читая каждую строку в памяти, получаяRowMapper перевести его в объект и сохранить каждую строкуОбъект в одном большом списке. Если ваш набор результатов огромен, то этот список станет большим, независимо от того, как JDBC извлекает данные строки.

Если вам нужно обрабатывать большие наборы результатов, то RowMapper isn 'т масштабируемый. Вы могли бы рассмотреть возможность использованияRowCallbackHandler вместо этого, вместе с соответствующими методами на JdbcTemplate.RowCallbackHandler Безразлично»диктуйте, как хранятся результаты, оставляя их на ваше усмотрение.

 yawn27 авг. 2009 г., 21:23
setFetchSize ничего не изменил для меня, я пытался использовать его раньше. Вы разрабатываете против экземпляра Oracle? Для меня RowCallBackHandler просто зависает, ожидая завершения запроса, как я написал в своем OP.
 gstackoverflow22 мар. 2019 г., 23:21
@skaffman, не могли бы вы привести пример?
 yawn28 авг. 2009 г., 09:58
Очевидно, я забыл вызов afterPropertiesSet () для шаблона JDBC в моем тесте. Смущает, но теперь это работает: *)

s свойство драйвера / соединения, передавать ли вам данные обратно или отправлять обратно одним чанком. Например, в SQL Server вы используетеSelectMethod Свойство на URL соединения:

jdbc:microsoft:sqlserver://gsasql03:1433;DatabaseName=my_db;SelectMethod=direct

Значениеdirect означает, что результаты должны прийти за один раз. Другой выборcursor, который позволяет вам указать, что вы хотите, чтобы соединение передавало вам результаты. Я'Я не уверен, что аналог дляоракул источник данных есть, яБоюсь

RowCallbackHandler конечно работает на меня.

 yawn27 авг. 2009 г., 21:25
Это звучит многообещающе. К сожалению, я не могНайти что-то похожее на этот параметр URL-адреса SQL Server в документации Oracle JDBC.
 Zoidberg27 авг. 2009 г., 15:58
Да, в идеалеЕсли вы не поместите его в набор данных, вы будете получать записи, оставляя соединение открытым, спрашивая, есть ли еще записи. Я сделал это в .NET и получил довольно хорошее улучшение производительности. Я думаю, что нечто подобное для Java будет существовать, особенно весной.
 oxbow_lakes27 авг. 2009 г., 16:03
@ * Zoidberg * - OP, кажется, делает правильную вещь, используя обработчик обратного вызова строки

Хорошая библиотека для загрузки всех наборов результатов Java в SQL.

http://casperdatasets.googlecode.com

вы можете прокручивать / выполнять итерацию по набору данных, вы можете создавать запросы к нему и создавать индексы для оптимизации. он также реализует интерфейс java.sql.resultset, так что вы можете продолжать работать с результатами этого набора данных с минимальными изменениями в своем коде jdbc.

 yawn07 янв. 2011 г., 12:12
Извините, но "как перебирать / прокручивать большие наборы результатов (которыепобедил'не вписывается в память).
 jli_12306 янв. 2011 г., 01:21
у него также есть адаптер, который преобразует набор результатов jdbc в набор результатов в памяти - я предполагаю, что вы можете вызывать этот адаптер в своем методе обратного вызова результатов jdbc.
Создайте пользовательскую хранимую процедуру, которая расширяетStoredProcedureСоздатьRowCallBackHandler который может обрабатывать каждый ряд, по одному за раз.Объявите ваши параметры. Если у вас есть набор результатов, сначала объявите его. ИспользоватьSqlReturnResultSet класс и создать его с помощью вашегоRowCallBackHandlerОбъявите любые другие параметрыкомпилироватьЯ сделал шаги со 2 по 5 в конструкторе хранимой процедуры моего клиентаСоздайте карту, содержащую ваши входные параметрыВыполните ваши хранимые процедуры с входными параметрами

но следующая статья содержит всю эту информацию.

Вызов хранимых процедур с помощью шаблонов Spring JDBC

Вы можете использоватьspringjdbc-итерацию библиотека:

CloseableIterator<myobj> iter = jt.queryForIter("select ...", params, mapper);
</myobj>

Итератор будет автоматически закрыт при исчерпании или может быть закрыт вручную. Это будет работать только в пределах транзакции.

Отказ от ответственности: я написал эту библиотеку

Ваш ответ на вопрос