За все время работы ни разу не слыхал о случаях какой-либо настройки Oracle Thin JDBC Driver. Он всегда используется "as is" и мало кому может вообще прийти в голову, что, возможно, именно он является тонким местом вашего приложения. Но это вполне может оказаться так.
Многие знают, что Oracle настоятельно рекомендует использовать jdbc последней (11g) версии даже для коннекта к 10 и 9-й версиям сервера. Немногие задаются вопросом "Почему". И зря. Именно в 11g версии они задекларировали существенное увеличение производительности и также добавили наконец механизмы настройки кэшей на уровне jdbc драйвра, что и предлагают настраивать самостоятельно в зависимости от режима использования. При этом в документации этот механизм кэширования назван настолько удачным, что заявлена большая производительность thin-драйвера перед OCI-драйвером (и в принципе рекомендуется переходить с oci на thin, поскольку его использование само по себе проще, да и производительность такая-же, если не лучше!)
To be continued ... >>>
>>> ... As of 10.1.0, the Thin driver is probably slightly faster than the OCI driver. ... <<<Однако, не все так радужно, хотя, говоря по правде, oracle не очень кривит душой - ибо было еще хуже. Вам повезло, если вы пишите "идеальное" приложение, где четкая модель данных, 3-я нормальная форма и аналитики абсолютно точно указали максимальные длины строковых полей. В реальной жизни вы встречаетесь с унаследованной структурой, часто специально де-нормализированной. Обмен csv-файлами остается, как это ни печально, если не основным, то существенным форматом интеграционного обмена в банковских и платежных системах (в таком виде, например, я видел не всегда захешированные номера кредиток, что высылались обычным SMTP от одной системы бухгалтерам другой, что после вручную импортировали эти данные для проведения сверки транзакций!). Часто это является следствием закрытости программных комплексов - выгрузка данных в csv из них является чуть ли ни единственной возможностью. В подобных случаях приходится в своей системе делать загрузочные таблицы, что состоят из сотен текстовых столбцов для хранения плоских записей информационного обмена. А однажды я рефакторил COBOL-овскую систему, в которой каждое новое состояние заказа сохранялось - где бы вы думали? - правильно, в новой группе столбцов таблицы! Там было ровно 1000 столбцов! И если вы узнаете в этом описании что-то из вашего проекта - эта статья для вас. Имеем таблицу со 250 колонками
nvarchar2(2000)
. Имеем некую процедуру - "Cleaner" - который блоками выбирает содержимое этих колонок на обработку, причем, на самом деле, данные содержаться только в первых 30-ти колонках - остальные не используются. Если указать в параметрах Cleaner-а выбирать из базы и анализировать только первые 50 столбиков, то получаем вот такой лог исполнения
...
20:59:59,016 INFO impl.Clean - Cleaner started in batch mode
21:00:00,243 INFO impl.Clean - 10 records cleaned
21:00:00,471 INFO impl.Clean - Cleaner started in batch mode
21:00:01,830 INFO impl.Clean - 10 records cleaned
21:00:01,864 INFO impl.Clean - Cleaner started in batch mode
21:00:03,005 INFO impl.Clean - 10 records cleaned
21:00:03,069 INFO impl.Clean - Cleaner started in batch mode
...
Если же сказать Cleaner-у выбирать из базы 100 колонок, то получаем вот такой лог
21:39:22,029 INFO impl.Clean - Cleaner started in batch mode
21:40:52,596 INFO impl.Clean - 10 records cleaned
21:42:28,825 INFO impl.Clean - Cleaner started in batch mode
21:42:31,744 INFO impl.Clean - 10 records cleaned
Сравните время, что потребовалось на выбор из базы 50 дополнительных пустых колонок. И кроме того - это полный лог. Ровно две итерации. Дальше - OutOfMemoryException.
0 comments:
Post a Comment