ResultSet загружает все данные в память или только при необходимости?

Хотя я знаю, что вы просите улучшить свой код. ИМХО лучшим подходом будет использование функции printf, и вы можете избежать использования слишком большого количества переменных, если они есть, только если у вас нет большой программы, в которой нам может понадобиться использовать эти переменные (которые мы получаем из значений столбцов / полей) позже в программе.

awk '{printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n",\
      $1,$2,$3,$4,\
      $3+$(NF-1)>101?"AAA":$3+$(NF-1),\
      $3+$NF>104?"BBB":$3+$NF,\
      $2+100,$5,$6,$2+5000+$3)
}'  Input_file

Вывод будет следующим.

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571


РЕДАКТИРОВАТЬ: Исправлена ​​попытка OP здесь.

Исправленное кодовое решение OP выглядит следующим образом:

awk '{
    tt1 = $1
    tt2 = $2
    tt3 = $3
    tt4 = $4
    tt5 = $5
    tt6 = $6
    x1 = tt3 + tt5
    x2 = tt3 + tt6 
    x3 = tt3 + tt2 
    x5=  x3 + 5000
  if(x1>101){x1="AAA"}
  if(x2>104){x2="BBB"}
    printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n", tt1,tt2,tt3,tt4,x1,x2,x3,tt5,tt6,x5)}'  Input_file

Вывод будет следующим.

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

Исправлены проблемы в коде OP:

1 - Удалено %5d и изменено на %d для удаления ненужных пробелов из десяти цифр .

2 - фиксированные разделители в printf изменили их на , между ними.

3- Удалена переменная x6, кажется, она НИКОГДА не использовалась, и изменила ее на x5.

4- изменен синтаксис условия if. Кажется, синтаксис НЕ был правильным, поскольку он был изменен с if{.....) на if(....).

5- Удален дополнительный awk, который НЕ использовался после вышеуказанных изменений в коде.

34
задан Paul Paulsen 15 April 2014 в 10:30
поделиться

4 ответа

Java ResultSet - это указатель (или курсор) на результаты в базе данных. ResultSet загружает записи в блоках из базы данных. Итак, чтобы ответить на ваш вопрос, данные извлекаются только тогда, когда вы их запрашиваете, но блоками.

Если вам нужно контролировать, сколько строк одновременно извлекает драйвер, вы можете использовать setFetchSize (int rows) в ResultSet. Это позволит вам контролировать размер блоков, которые он извлекает сразу.

41
ответ дан 27 November 2019 в 16:56
поделиться

В спецификации JDBC не указывается, передаются ли данные в потоковом режиме или загружаются в память. Потоки Oracle по умолчанию. MySQL этого не делает. Чтобы MySQL транслировал набор результатов, вам необходимо установить следующее в Statement:

    pstmt = conn.prepareStatement(
        sql,
        ResultSet.TYPE_FORWARD_ONLY,
        ResultSet.CONCUR_READ_ONLY);
    pstmt.setFetchSize(Integer.MIN_VALUE);
11
ответ дан 27 November 2019 в 16:56
поделиться

Хотя в спецификации JDBC не указывается, будут ли извлечены все данные в наборе результатов, ни один хорошо написанный драйвер этого не сделает.

Тем не менее, прокручиваемый набор результатов может быть больше того, что вы имеете в виду: (ссылка отредактирована, она указывает на страницу шпионского ПО)

Вы также можете рассмотреть отключенный набор строк, который хранится в сеансе (в зависимости от того, насколько масштабируемым должен быть ваш сайт): http://java.sun.com/j2se/1.4.2/docs/api/javax/sql/RowSet.html

1
ответ дан 27 November 2019 в 16:56
поделиться

Лучшая идея - сделать подзапрос и отображать 100 или 1000 строк за раз / на одной странице. И управление соединением с помощью пула соединений.

Чтобы сделать подзапрос, вы можете использовать количество строк в oracle и ограничение в MY SQL.

0
ответ дан 27 November 2019 в 16:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: