Oracle Thin JDBC Driver tuning

April 17, 2010

Oracle Thin JDBC Driver tuning

[ru] [en]

Please, see the beginning of this dramatic story here

[ page 1 ][ page 2 ][ page 3 ][ page 4 ]

Сначала постараюсь показать на пальцах насколько все плохо, а если хватит сил - то и почему. Итак, я начал изучать buglist на предмет получения каких-то ориентиров. Небольшое "гугление" принесло такой результат. Это, оказывается, официальная фича! Мило!
>>> Some memory Leak when using PreparedStatement with tables containing large char or varchar column. The problem can be worked around by enabling statement caching <<<
А у нас по в таблице 250 колонок максимальной длины в 2000 символов - больше только BLOB. Проблема - налицо. Также потрясающий своей лаконичностью баг (правда, говорят, что он пофикшен, но что-то мне подсказывает, что...)
>>> BUG-6474141 : large memory used for null columns <<<
Если участь, что большинство из моих 250 колонок таблицы имеют именно значение null...
Итак, запускаю jvisualvm, корректирую Xms/Xmx, добавляя по-максимуму памяти, и последовательно выполняю два одинаковых sql-запроса
  • 11:38:40 - первый же запрос выжирает почти 400 Mb
  • 11:38:50 - второй запрос выводит общее кол-во занятой памяти до 700 Mb
дальше решил не продолжать - OutOfMemory я уже видел. Все осложняется тем, что до сегодняшнего дня приложение отлично работало на MySQL вообще без какой-либо конфигурации параметров запуска JVM (то есть на 64 Mb) - а значит, проблема именно в драйвере а не в моем коде - и подобной засады я не ожидал.

Начинаю искать какие иные варианты, кроме thin-драйвера существуют - помню, в 2000, я (да и все остальные, собственно говоря) использовал драйвера от weblogic, также, помнится, был какой-то opensource проект... Но годы идут - все, что называлось weblocic, называется oracle, да и sun как-то больше не светит и все, что удается быстро найти это:

  • The Oracle Driver (Deprecated) - не понял точно что-это, возможно, это старый добрый jdbc драйвер от weblogic? Но скачать или купить отдельно его нельзя - только в составе weblogic server
  • i-net JDBC drivers - не могу найти ссылку как скачать и проверить этот драйвер. Только - как купить.
  • DataDirect JDBC Drivers - кажется то, что нужно! Сразу же нахожу ссылку на evaluate.
Первый же запуск приложения на драйвере от DataDirect более чем обнадеживает - далее приведен график за первые две минуты (uptime). Видно, что примерно в 11:45:50 была произведена первая выборка данных. Эта операция сразу заняла около 180 Mb памяти. В дальнейшем рост потребления памяти был незначителен и к концу второй минуты потребление памяти осталось на уровне 200 Mb. Незначительный рост объясняется тем, что GC просто не вызывался и ни разу не отрабатывал, поскольку общее кол-во свободной памяти, выделенной процессу, оставалось очень велико.
Итак, уменьшаю в два раза общее количество памяти выделенное процессу, запускаю его и ухожу на обед.
За 55 минут работы было обработано 10100 записей и GC вызывался только один раз! кажется - панацея найдена и мы начинаем переговоры с DataDirect о цене.
So, at first I'll try to show in details what is wrong and, if I can, why is. Some "googling" takes me a result. Oh! This is an official feature! Nice!
>>> Some memory Leak when using PreparedStatement with tables containing large char or varchar column. The problem can be worked around by enabling statement caching <<<
But I have a 250 columns by 2000 characters – just a BLOB can be biger. I god a problem. Also perfect in laconic the BUG (telling the trues it marked as fixed, but I think it... it fixed in general)
>>> BUG-6474141 : large memory used for null columns <<<
By the way, the biggest part of my columns keeps null...
So, I had started the jvisualvm, had corrected Xms/Xmx, (add memory as much as possible) and perform sequentially two equals sql-queries
  • 11:38:40 - a first takes immediately near 400 Mb
  • 11:38:50 - another increase this volume up to 700 Mb
enough, I have already seen the OutOfMemory before. Everything is complicated by the fact that until now the application works fine on MySQL without any configuration of JVM parameters (64 Mb bu default) - so, the problem is in the driver but not in my code - I was not expecting of such ambush.

Ok, I start to looking for some alternatives to thin-drivers. As I can remember, in previous century I (and all other) use a weblogic driver. Also some OpenSource project was incestigated... But the years gone by – all that was named “weblogic” is names “oracle” now, and even “sun” is not so bright and all I have found is:

  • The Oracle Driver (Deprecated) - I do not catch what is it exactly – maybe it is a good old weblogic jdbc driver? But it can not been downloaded or obtained separately – only together with the weblogic server
  • i-net JDBC drivers - also I can't find any download link to evaluate it.
  • DataDirect JDBC Drivers - It looks like what I need! And a direct link to evaluate.
The first run of the application with the new driver of DataDirect is more than encouraging - Following is the schedule for the first two minutes (uptime). You can see, that near by 11:45:50 a first query was performed. It takes 180 Mb. After that increasing of memory consumption was negligible and by the end of the second minute the memory consumption remained at the level of 200 Mb. This increasing can be explained that GC just was unused, because the total volume of free memory allocated by the process was very large.
So, halved the total volume of memory allocated to the process, run it and go for lunch.
A 55 minutes was taken for processing of 10100 records and GC was called just once! The cure is found and we are starting negotiations with DataDirect about pricing.
To be continued... >>>

0 comments:

Post a Comment