|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
||||||
Если кто работал с Oracle/JDBC под Linux, помогите советом !!!!22.09.2008, 21:50. Показов 3549. Ответов 22
Метки нет (Все метки)
Добрый день !!!
В процессе нагрузочного тестирования столкнулись с неожиданной проблемой - утечкой памяти из-под работающей JVM интенсивно читающей из СУБД, постепенно убирая все свое дошли до элементарного примера (писать в ответе что так веб-приложения не пишут не надо, мы и так это знаем, это просто ПРИМЕР !!!!!):
малым временем сессии - порядка минуты, благодаря этому количество сессий в Резине через некоторое время стабилизируется, а пямять продолжает утекать, затем начинает расти swap, производительность падает, затем все умирает. Причем изнутри JVM объем доступной и максимальной памяти не меняется, меняется только объем самой JVM в системе. Тестировали под JVM IBM 1.3.0 и Sun 1.4.0, ОС Linux RedHat 7.3 и на машине с Resin 2.1.0 и на машине с Oracle 9.2, драйвера поставили последние, рекомендованные под JDK 1.4. Такая же картина наблюдается с предыдущими версиями JDK и Oracle 8.1.6, правда утечка менее интенсивна, но и скорость чтения из БД снижается. Данная проблема лечится только переходом под w2k, там все нормально и с памятью и с производительностью. Вопрос - не встречались ли вы с чем-нибудь подобным и не посоветуете ли что-нибудь, кроме смены ОС ??? Может у нас крыша поехала, на всякий случай прилагаю код тестовой JSP.
0
|
||||||
| 22.09.2008, 21:50 | |
|
Ответы с готовыми решениями:
22
Ошибка в jdbc+oracle: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver Кто-нибудь работал с Oracle JDeveloper??? Кто работал с Word'ом из Бейсика помогите? |
|
mishgun
|
|
| 23.09.2008, 00:40 | |
|
А может вам эту строку
int fcnt = rs.getMetaData().getColumnCount(); все-таки вынести за пределы while?Судя по описанию проблемы это вполне может быть while (он это умеет ЛОЛ).Тем более что нет никакого смысла каждый раз создавать в лупе переменную содержащую количество колонок.... |
|
|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
|
| 23.09.2008, 09:58 [ТС] | |
|
Согласен, это не функционально, только вынесение дела к сожалению не меняет .... вообще скорость утечки зависит от объема выкачиваемых данных и от скорости работы с СУБД (в общем-то тоже от объема ....). Пробовали JServ/Tomcat, все то же самое. Сервер 9.2 под Линукс тоже ведет себя странно - после создания индекса или сбора статистики производительность падает просто катастрофически, лечится только перезагрузкой сервера СУБД.
0
|
|
|
0 / 0 / 2
Регистрация: 17.08.2007
Сообщений: 222
|
|
| 23.09.2008, 12:01 | |
|
Может быть это связано с тем, что коннект к Oracle создается свой для каждого клиента и существование 300 объектов коннекшн является непосильным грузом; возможно следует попробывать явно создать пулл объектов и брать коннекты непосредственно из пула?
0
|
|
|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
|
| 23.09.2008, 12:08 [ТС] | |
|
Вряд ли ... во-первых в той системе, в которой мы впервые столкнулись с данной проблемой был пул соединений и это ничего не лечило. Во-вторых у нас на сервере СУБД установлен лимит 150 соединений, в третьих даже 300 соединений (а реально даже без пула их меньше) не должно приводить к утечке, к медленной работе да, согласен, но утечка это уже явная ошибка .... В четвертых запуск 50 виртуальных клиентов ничего не лечил, только утечка шла медленнее ...
0
|
|
|
0 / 0 / 2
Регистрация: 17.08.2007
Сообщений: 222
|
|
| 23.09.2008, 12:59 | |
|
Как известно, в java мы имеем власть только над созданием объектов, когда они будут удалены - мы не знаем и гарантировать то , что они больше не существуют - не можем. Имеется в виду, что дать гарантию, что после вызова метода con.close() экземпляр класса Connection освободил занимаемые ресурсы нельзя. В тоже время можно с уверенностью сказать, что при вызове метода DriverManager.getConnection() некие ресурсы были выделены. Т.е. даже если имеется 50 клиентов, то каждый вызов каждого клиента занимает ресурсы.
То же самое можно сказать, про механизм создания пула, зашитый в неком продукте. Если использовался пул, механизм работы которого не прозрачен, то он мог натворить вской несуразицы. Нужно точно знать как работает пул. Имелось в виду следующее, что если не понятно куда утекают ресурсы нужно иметь жесткий контроль над ними, для этого механизмы создания и хранения объектов должны быть прозрачны. У нас народ пользуется библиотеками, находящимися здесь: http://jakarta.apache.org/commons/pool/index.html, они с открытым кодом и бесплатны. Гляньте, может поможет...
0
|
|
|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
|
| 23.09.2008, 13:10 [ТС] | |
|
Как работает пул знаем - сами писали. Утечка памяти идет судя по всему не в жабе, так как объемы доступной и свободной памяти видимые изнутри JVM не меняются, растет сама жаба, как приложение в системе. Это раз, во-вторых такой проблемы нет под виндами, а если это была бы лшибка на уровне жабы, то она бы была. Скорее всего проблема в нативных функциях клиента Оракла, вызываемых через JDBC переходник.
Опять-таки, использование или отказ от пула не должны влиять на утечку памяти, только на производительность. С точки зрения стандарта JDBC/Oracle код абсолютно нормален, что свидетельствует о проблемах самого Оракла. У вас народ пользуется какой СУБД и под какой ОС ???? КАкая примерно интенсивность работы с СУБД ???
0
|
|
|
0 / 0 / 0
Регистрация: 07.09.2008
Сообщений: 13
|
|
| 23.09.2008, 13:44 | |
|
У нас та же проблема была и под w2k. Причем с MYSQL. Коннект создавался всего один раз в init а потом только statement'ы создавались Причем сама jvm не росла выше положенного но использованная память в системе утекала. Решилось все только созданием каждый раз нового коннекта на запрос. (как в вашем примере). Кстати в jdbc2.0 пул должен вроде автоматически создаваться и рукотворном нужды нет
0
|
|
|
0 / 0 / 2
Регистрация: 17.08.2007
Сообщений: 222
|
|
| 23.09.2008, 14:07 | |
|
У нас в принцепе немного другая схема работы (WEB - клиент работает с БД через EJB, при этом, помимо выбора объектов из пула, данные запросов кэшируются на сервере).
А вообще БД - оракл, стоит на солярисе и на нт2000. И там и там нормально. to bodrelka: в jdbc2.0 включены классы и интерфейсы для поддержки пула, но то как он работает зашито в драйвере, его поддерживающем и (или) сервере.
0
|
|
|
0 / 0 / 0
Регистрация: 07.09.2008
Сообщений: 13
|
|
| 23.09.2008, 14:40 | |
|
2vold
То есть всетаки свой пул ставить имеет смысл?
0
|
|
|
0 / 0 / 2
Регистрация: 17.08.2007
Сообщений: 222
|
|
| 23.09.2008, 15:42 | |
|
2 bodrelka:
Безусловно все зависит от задачи. Если все хоршо, без збоев, особо не загружая ресурсы работает, каждый клиент может вполне открывать новое соединение, закрывать его... Но при росте системы, при увеличении числа клиентов, при количественном и качественном росте транзакций такие вещи уже не прокатывают, на создание объектов тратиться слишком много ресурсов, а механизмы поддержки пула, релизованные сторонними коммерческими разработчиками не всегда устраивают. Тогда либо нужно писать свои библиотеки, либо искать то, что соответствует требованиям. Примернр так.
0
|
|
|
mishgun
|
|
| 23.09.2008, 20:24 | |
|
А что если код соединения перенесчти в JavaBean и дать ему scope=page? Тогда по идее после вызова Бина и распечатки данных из Базы этот бин умрет?
|
|
|
0 / 0 / 1
Регистрация: 23.01.2008
Сообщений: 251
|
|
| 23.09.2008, 22:18 | |
|
А что если пересесть на DotNet???
0
|
|
|
mishgun
|
|
| 23.09.2008, 22:58 | |
|
to kreеk
а если внимательно прочитать чего автор пишет?Или что уже есть .net под Линукс? |
|
|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
|
| 23.09.2008, 23:01 [ТС] | |
|
>А что если код соединения перенесчти в JavaBean и дать ему >scope=page? Тогда по идее после вызова Бина и распечатки данных из >Базы этот бин умрет?
и что ????????????? ссылка на соединение и так имеет область определения одни метод результирующего сервлета и тоже умирает после генерации страницы ... никакой разницы >А что если пересесть на DotNet??? Смысл ??? проще уже имеющееся приложение эксплуатировать на w2k, там для этого все есть ... правда w2k как платформа для интернет-приложений внушает нам серьезные опасения......
0
|
|
|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
|
| 23.09.2008, 23:01 [ТС] | |
|
>А что если код соединения перенесчти в JavaBean и дать ему >scope=page? Тогда по идее после вызова Бина и распечатки данных из >Базы этот бин умрет?
и что ????????????? ссылка на соединение и так имеет область определения одни метод результирующего сервлета и тоже умирает после генерации страницы ... никакой разницы >А что если пересесть на DotNet??? Смысл ??? проще уже имеющееся приложение эксплуатировать на w2k, там для этого все есть ... правда w2k как платформа для интернет-приложений внушает нам серьезные опасения......
0
|
|
|
0 / 0 / 0
Регистрация: 07.09.2008
Сообщений: 13
|
|
| 24.09.2008, 09:00 | |
|
По моему опыту проблема в jdbc драйвере. Попробуйте другой драйвер или дб(как тест). System.gc(); не помогает - знаю твердо, это не повисшие Java обьекты это гдето вообще вне java.
0
|
|
|
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9
|
|
| 24.09.2008, 10:07 [ТС] | |
|
Абсолютно с bodrelka согласен, на мой взгляд утечка памяти происходит в нативном коде, то есть где-то в самом клиенте Oracle, в каких то его бинарных модулях, которые используются OCI-драйверам jdbc. Данный код исполняется в рамках того же потока, что и JVM но не внутри нее. Поэтому утечка памяти видна на системном уровне и не видна внутри JVM. Пробовали разные версии драйверов результаты плачевные. В результате пришлось перейти на w2k. Resin + IBM JVM 1.3 отлично там работают, держат нагрузку и не дают никаких проблем. Видимо в Oracle считают, что никто всерьез использовать их технологии под ЛИнукс не будут, очень симптоматично ... кстати, сервер под Линукс тоже ведет себя очень странно
0
|
|
|
0 / 0 / 0
Регистрация: 07.09.2008
Сообщений: 13
|
|
| 24.09.2008, 10:33 | |
|
я то надеялся, что проблема решаема - у меня была та же дрянь с MySQL. Что за хрень - надо баг репорт писать!. Вот еще - а какая версия Oracle мб неполная(триальная) или плохо украденная - тогда может быть все что угодно...
0
|
|
|
mishgun
|
|
| 25.09.2008, 02:55 | |
|
Народ грит что Oracle сукем=ифицирован под SuSe Linux а не под RedHat
|
|
| 25.09.2008, 02:55 | |
|
Помогаю со студенческими работами здесь
20
Если кто-то работал с видео в С++, подскажите. Уважаемые форумчане. Помогите с советом. С советом о жизни. Как узнать, кто работал в заданное время и под какой учеткой Кто-ть работал с 1С под MySQL или Sybase SQL Anuwhere Server? Кто работал с BDE, помогите настроить доступ к Paradox через ODBC... Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|