Соединение с данными — параллельное извлечение JDBC завершается с ошибкой OutOfMemoryError

Я пытаюсь запустить несколько экстрактов JDBC параллельно, но это не удается: java.lang.OutOfMemoryError: Java heap space.

Как работает использование памяти Data Connection и как решить эту проблему?


person Andrew St P    schedule 22.09.2020    source источник


Ответы (1)


Использование памяти агентом подключения данных здесь фактически зависит главным образом от значения параметра fetchSize. Согласно документации по драйверу JDBC для Oracle< /а>, fetchSize:

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

Таким образом, использование памяти агентом должно быть примерно таким:

number of JDBC extracts running in parallel x fetchSize x size of each row

К сожалению, значение fetchSize по умолчанию сильно различается в разных драйверах JDBC. Например, в некоторых версиях драйвера Hive JDBC для него установлено значение 50, в то время как в других, более новых версиях значение по умолчанию равно 1000. Драйверы Oracle JDBC по умолчанию имеют значение 10. По умолчанию Postgres попытается получить весь ResultSet сразу.

Таким образом, Data Connection позволяет настроить значение fetchSize. Это настраивается как для каждого источника, так и для каждого извлечения.

Помимо ошибок OOM, настройка fetchSize может значительно повысить производительность в общем. Однако универсального решения не существует, и вам придется поэкспериментировать, чтобы определить наилучшее значение параметра для ваших экстрактов. Обычно он лежит где-то в диапазоне 500–5000.

person Adil B    schedule 22.09.2020