2013-09-20 3 views
0

Могу ли я ограничить количество строк в наборе результатов? В моей таблице содержится около 800000 строк, если я их извлечу из набора результатов, это, безусловно, приведет к исключению OOM. каждая строка содержит 40 столбцов. Я не хочу работать с ними в одно и то же время, но каждая строка должна быть отфильтрована для некоторых данных.Как получить ограниченные данные из mysql java

Заранее спасибо.

+0

Не могли бы вы показать свой запрос sql? –

+0

Вы можете добавить что-то вроде верхнего 1000 (или) предел 0, 1000. Ограничение работает точно в workbench mysql, не знаю в java-коде. – kosa

+0

Можете ли вы предоставить код Java? Маловероятно, что драйвер java-db будет загружать все строки до памяти и будет загружать только строки по мере необходимости. – Jim

ответ

1

Что-то вроде следующего должно быть SQL-решением, но хотя и весьма неэффективным, так как каждый раз вам придется извлекать увеличивающееся количество строк.

Если предположить, что у вас есть ORDER BY базируется на уникальнойint и , что вы будете Fetching 1000 строк в то время.

SET currenttop = 0; 
SET cuurentid = 0; 
SELECT * FROM YourTable t 
WHERE t1.ID > @currentID AND (@currentid := t1.ID) IS NOT NULL; 
LIMIT (@currenttop:[email protected]+1000); 

Конечно, вы можете обрабатывать переменную из своего Java-кода.

-1

У вас есть пара вариантов. Во-первых, добавьте ограничение на запрос SQL. Во-вторых, вы можете использовать JDBCTemplate.query() с RowCallbackHandler для обработки одной строки за раз. Шаблон будет обрабатывать проблемы памяти с большим набором результатов.

+0

Не могли бы вы указать, как он управляет проблемой памяти. Я думаю, что ваш ответ вводит в заблуждение –

+0

Он загружает ограниченное количество результатов за раз. Я не знаю точное количество alg, но он захватывает результаты пакетами, которые должны быть переданы обработчику по одному. –

+0

Шаблон Spring Jdbc является оберткой на стандартном API JDBC. Он использует тот же метод jdbc для установки размера выборки, см. Http://docs.spring.io/spring/docs/2.0.x/api/org/springframework/jdbc/core/JdbcTemplate.html # setFetchSize% 28int% 29 –

0

Вы можете использовать ключевое слово limit с SQL запросом см следующего

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 

Вы можете прочитать больше об использовании limithere

Ура !!

+0

ResulSet rs = null; PreparedStatement ps = con.prepareStatement («выберите * из таблицы»); ps.setFetchSize (100); rs = ps.executeQuery ("select * from table"); if (rs.next()) { System.out.println (rs.first()); } Это не работает должным образом. –

+0

ps.setMaxRows (20); Это работает. Он выбирает только 20 строк за раз –

1

Вы можете использовать JDBC fetch size, чтобы ограничить результат в результирующем наборе. Он лучше, чем SQL LIMIT, так как он будет работать и для другой базы данных, не меняя запрос. Diriver Jdbc не будет считывать весь результат из базы данных. Каждый раз, когда он будет извлекать записи, заданные размером выборки, больше не будет проблем с памятью.

Смежные вопросы