Потоковая передача результатов DAO в Java (шаблон проектирования) - PullRequest
0 голосов
/ 14 января 2011

Учитывая следующую ситуацию:

  • DAO, который запрашивает все строки из таблицы и отображает их в список объектов домена (чисто JDBC)
  • Служба, которая обрабатываетlist, получаемый из DAO и отображающий определенные элементы списка в формате файла.

Проблема здесь в том, что все результаты DAO хранятся в памяти, что становится опасным по мере роста таблиц.

Вопрос: Существует ли шаблон для чтения объектов из DAO в потоковом режиме, когда служба обрабатывает только один элемент за раз, записывает его в поток вывода файла и затем запрашивает следующий элемент из результатазадавать?Является ли вообще хорошей идеей использовать ResultSet в качестве типа возврата DAO?

Ответы [ 4 ]

4 голосов
/ 14 января 2011

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

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Вы должны заключить это в DAO, вы можете вернуть собственный итератор для обработки результатов.

См. mysqlссылка на тему потоковых результатов.

1 голос
/ 14 января 2011

Лучший способ - выполнить постраничный запрос, вы можете либо получить общее количество строк, а затем выбрать размер страницы и использовать инструменты базы данных (rowid для oracle), чтобы получить страницы, пока у вас не будет всех строк или вы можете простопродолжайте запрашивать, пока не получите никаких результатов.

0 голосов
/ 14 января 2011

Я бы никогда не вернул бы ResultSet из DAO, сохранил бы логику данных инкапсулированной в классе данных.

Я бы, вероятно, также никогда не писал метод DAO, который возвращал бывся таблица кажется слишком общей.Вместо этого я бы, вероятно, написал метод DAO с именем dumpToFile(File f), который выполнял всю работу внутри.Таким образом, DAO может читать записи по одной и записывать их в файл.

0 голосов
/ 14 января 2011

То есть вы обрабатываете данную строку только один раз? Вы можете пометить эту строку как обработанную в базе данных и выбрать только те строки, которые не обработаны. Или вы можете переместить обработанные строки в другую таблицу.

...