Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 JDBC + Oracle  [new]
free_blocks
Guest
Вопрос такой, ява через jdbc обращается к ораклу, запрос выполнен

  Connection con = ConnectionFactory.getNewConnection();
  Statement stmt = con.createStatement();

  ResultSet rs = stmt.executeQuery("..");


Начинаем построчную обработку
  while(rs.next());


Пускай FetchSize равен 10. Вот тут вопрос. Первая запись rs.next() будет извлечена только когда от базы данных будет физически получено 10 записей?
3 мар 16, 12:47    [18891567]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9241
Смысл вопроса не понятен.

Если сферически - то ответ да.

IMHO & AFAIK
3 мар 16, 13:13    [18891736]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
free_blocks
Guest
Leonid Kudryavtsev
Смысл вопроса не понятен.

Если сферически - то ответ да.

IMHO & AFAIK


В цикле ведется аудит полученных записей, обычно на обработку одной тратится 2ms. Была ситуация, когда обработка второй записи заняло 3 секунды, а третьей - 2 секунды. Если на момент первого вызова rs.next() от базы уже получено 10-записей, то второй и третий вызов rs.next() берез записи не из базы, а они уже у явы. В таком случае причину долгой обработки нужно искать на сервере приложений.
3 мар 16, 14:24    [18892227]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9241
В цикле где?
Аудит в БД или в цикле на Java?

Как я понимаю, "навигацию" (получение следующей записи) и так делает rs.next. Т.ч. совсем не ясно, как fetchSize соотносится с вашим "в цикле ведется аудит полученных записей"

А задержка может быть вообще откуда угодно. Хоть нагрузка, хоть сеть, хоть Garbage Collector.

Ну и как конкретно работает, явно нужно смотреть сорцы. Т.ч. логично, что бы запрашивали весь пакет у сервера и потом его обрабатывали из буфера. Но "логично", не значит "гарантированно". 100% гарантию даст только просмотр кода конкретной версии JDBC IMHO.
3 мар 16, 14:56    [18892441]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9241
Ну и нужно знать запрос и структуру таблиц

Если там есть LOB, Long'и или производные от них типы, то в ряде версий/настроек setFetchSize будет принудительно поставлен в 1. Т.ч. и с Вашим утверждением "Пускай FetchSize равен 10" может быть "не все так очевидно" ( C )
3 мар 16, 14:59    [18892467]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
free_blocks
Guest
Leonid Kudryavtsev
В цикле где?
Аудит в БД или в цикле на Java?

Как я понимаю, "навигацию" (получение следующей записи) и так делает rs.next. Т.ч. совсем не ясно, как fetchSize соотносится с вашим "в цикле ведется аудит полученных записей"

А задержка может быть вообще откуда угодно. Хоть нагрузка, хоть сеть, хоть Garbage Collector.

Ну и как конкретно работает, явно нужно смотреть сорцы. Т.ч. логично, что бы запрашивали весь пакет у сервера и потом его обрабатывали из буфера. Но "логично", не значит "гарантированно". 100% гарантию даст только просмотр кода конкретной версии JDBC IMHO.


Аудит в цикле явы.

Навигацию делает rs.next(). Это выборка одно следующей строки. Он ее берет из ResultSet. ResultSet получаем запросом fetch к БД с параметром fetchSize=10. Если база вернет сразу 10 строк, то второй и третий вызовы rs.next() будут брать строки из кэша, значит при поиски проблемы можно исклюить БД и сеть, остается только сам сервер приложений.
3 мар 16, 15:01    [18892483]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9241
Как Вы собираетесь делать "поиск проблемы" ? И как он зависит от исходного вопроса ?

Сделайте нормальный тайминг выполнения в цикле и увидите, что именно тормозит. rs.next() или вычисления (и какие)

1. Пока все выглядит так, как будто "ищут виноватого"
2. Вы не привели ни запроса, ни структуры таблиц (данных), ни кода, ни версии JDBC / Server'а

При "сферическом коне" - ответ, да.

При не сферическом - все "не так очевидно" ( C )

1) setFetchSize может не работать с Blob/Long и им подобными типами (поведение сильно зависит от версий)
2) зависеть от глобальных настроек
Т.ч. как говорил Остап, "полную гарантию дает только страховой полис".

Может быть у Вас там Lob'ы. В одной строке 100 байт, в другой строке 100 Mb'ай. Тогда и 2-3 сек это быстро )))
3 мар 16, 15:21    [18892604]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
just_vladimir
Member

Откуда:
Сообщений: 870
При исходной постановке вопроса и всех настройках по умолчанию, то ответ "да, на сторону java уйдут первые 10 записей".
Разделите код по вытаскиванию из БД и дальнейшую логику по обработке, все будет очевидно.
3 мар 16, 18:07    [18893580]     Ответить | Цитировать Сообщить модератору
 Re: JDBC + Oracle  [new]
just_vladimir
Member

Откуда:
Сообщений: 870
Leonid Kudryavtsev
Если там есть LOB, Long'и или производные от них типы, то в ряде версий/настроек setFetchSize будет принудительно поставлен в 1.

Это да, действительно есть такой нюанс.
3 мар 16, 18:10    [18893594]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить