Я использую kafka jdbc connector для oracle базы. Он вычитывает данные из таблицы и пушит в топик. Я пишу sql запрос, без where блока и использую incremental mode, то есть он завязывается на какую-то колонку в таблице и добавляет к запросу where блок с этой колонкой. Так же есть проперти query suffix, там можно добавить что-то к запросу, в postgre я добавлял LIMIT 75, поэтому коннектор вычитывал по 75 строк и пушил в топик. Теперь к проблеме на проде у нас oracle 11g, FETCH там ещё не завезли и у меня нет идей, как написать запрос, который будет вычитывать всю базу от начала до конца по 75 строк?
В оракле всегда ограничивали выборку псевдостолбцом rownum. Но работать им, сохраняя параллелизм очень затруднительно. Его нельзя ограничивать снизу: условие rownum > n никогда не выполнится, нужно оборачивать запрос и фильтровать во внешнем запросе или использовать CTE. А создание фильтра в подзапросе средствами кафка, наверное, невозможно, так что фильтр сломается. Возможно, надо сгенерить запрос вручную и отправлять его каждый раз с новым фильтром по выбранному полю, лучше через bind-переменную, чтобы не хард-парсить. Но думаю, производительность очень сильно пострадает, я бы не стал рассчитывать на быструю выгрузку даже десятков гигабайт. Разве jdbc коннектор нельзя настроить, скажем, параметром fetchSize, чтобы решить проблему на уровне драйвера и брать все нужные данные в одном запросе? Это в любом случае будет быстрее, чем выполнение множества запросов с ограничением количества строк
Привет, для jdbc source connector есть batch.max.rows - дефолтное значение 100. Т.е. если я правильно понимаю вычитывает по 100 строк.
batch.max.rows Maximum number of rows to include in a single batch when polling for new data. This setting can be used to limit the amount of data buffered internally in the connector. Type: int Default: 100 Importance: low
У меня эта опция на source jdbc коннекторе при подключении к MySQL не работала, пришлось ограничивать силами jdbc драйвера. Добавлял параметр Fetch, как выше писалось
не совсем, тк коннектор работает с многими базами, то нужно для ограничения фетча писать свою имплементацию, т.к во всех бд по разному, а batch ограничивает кол-во строк, которое за раз запишется в топик, но вычитывать из бд будет все данные
Ну вот по MySQL мне вот это помогло jdbc:mysql://{{HOST}}:{{PORT}}/{{DB}}?&selectMethod=cursor&defaultFetchSize=100&useCursorFetch=true
спасибо, интересное решение!
Для оракла такое не нашел, мб знаешь?
Вижу только нечто отдаленно напоминающее maxStatements, но не готов сказать на 100%, что это оно
https://docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OracleDriver.html
Обсуждают сегодня