Какие драйверы JDBC правильно поддерживают чувствительность/нечувствительность к прокрутке?

Я только что узнал, что драйвер Postgres Java JDBC на самом деле не поддерживает режимы SCROLL_SENSITIVE/SCROLL_INSENSITIVE с использованием потоковой передачи, а вместо этого имитирует эти режимы, загружая сразу полный набор результатов в память клиента. Для запросов с большим набором результатов это может привести к неожиданно большому использованию памяти, особенно в таком языке, как Java, с небольшой поддержкой неупакованных значений. При использовании режима FORWARD_ONLY драйвер передает результаты, как и ожидалось.

(детали; Насколько я понимаю, это ограничение проводной протокол Postgres, хотя теоретически драйвер мог бы обойти это, преобразовывая запросы в явные курсоры.)

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


person JanKanis    schedule 13.10.2016    source источник
comment
JDBC заполнен различиями между базами данных, а иногда даже между драйверами (не версиями драйверов) для одной и той же базы данных. Это слишком широко, чтобы начать перечислять их здесь.   -  person Kayaman    schedule 13.10.2016
comment
Ваш вопрос довольно неясен. Вы хотите найти другие драйверы, которые делают то же самое, что и драйвер, который вы указали здесь? Или альтернативные драйвера, которых нет? Конечно, все водители не созданы равными. Вы можете попробовать от моего работодателя. Базы данных тоже различаются; Виртуоз исходит от моего работодателя.   -  person TallTed    schedule 13.10.2016
comment
Я отредактировал вопрос, чтобы уточнить намерение. Я ищу драйверы, которые не реализуют потоковую прокрутку, аналогичную драйверу postgres, поэтому я знаю, что нужно следить за таким поведением, если я использую один из этих драйверов.   -  person JanKanis    schedule 17.10.2016


Ответы (1)


MySQL/MariaDB немного хуже, чем Postgres. Как и Postgres, он по умолчанию буферизует весь результат запроса. Также, как и Postgres, он может выполнять только прокрутку вперед без буферизации, но, в отличие от Postgres, соединение с базой данных занято, пока результат запроса не исчерпан и не может использоваться для других запросов одновременно. Любые блокировки и другие ресурсы также удерживаются до тех пор, пока результирующий набор не будет исчерпан, поэтому не рекомендуется оставлять результирующий набор открытым на долгое время. ref

Oracle передает результаты по умолчанию, но сервер или сетевой протокол не поддерживает прокрутку назад. Драйвер JDBC эмулирует прокрутку, кэшируя результаты, если установлено SCROLL_INSENSITIVE или SCROLL_SENSITIVE. Таким образом, кроме значения по умолчанию, это похоже на Postgres. ref

person JanKanis    schedule 17.10.2016