Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 22.09.2008
Сообщений: 9

Если кто работал с Oracle/JDBC под Linux, помогите советом !!!!

22.09.2008, 21:50. Показов 3509. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день !!!
В процессе нагрузочного тестирования столкнулись с неожиданной
проблемой - утечкой памяти из-под работающей JVM интенсивно читающей
из СУБД, постепенно убирая все свое дошли до элементарного примера (писать в ответе что так веб-приложения не пишут не надо, мы и так это знаем, это просто ПРИМЕР !!!!!):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<%@page import= 'java.io.*'%>
<%@page import= 'java.sql.*'%>
<% 
Connection con= null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName ('oracle.jdbc.driver.OracleDriver');
con = DriverManager.getConnection ('jdbc:oracle:oci8:***/****@*****');
stmt= con.createStatement();
rs = stmt.executeQuery('SELECT ... ');
 
while (rs.next()) {
int fcnt = rs.getMetaData().getColumnCount();
for(int i=1;i<=fcnt;i++)
out.println(rs.getString(i)+'
');
}
 
} catch (Exception e){
out.println (e.getMessage());
System.out.println(e.getMessage());
} finally {
try { rs.close(); } catch (Exception e1 ) {
out.println (e1.getMessage());
System.out.println(e1.getMessage());
}
try { stmt.close(); } catch (Exception e1 ) {
out.println (e1.getMessage());
System.out.println(e1.getMessage());
}
try { con.close(); } catch (Exception e1 ) {
out.println (e1.getMessage());
System.out.println(e1.getMessage());
}
}
 
%>
Эту страницу гоняем тестировщиком с 300 виртуальными пользователями и
малым временем сессии - порядка минуты, благодаря этому количество
сессий в Резине через некоторое время стабилизируется, а пямять
продолжает утекать, затем начинает расти 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2008, 21:50
Ответы с готовыми решениями:

Ошибка в jdbc+oracle: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
Вот такой трабл: на Class.forName('oracle.jdbc.driver.OracleDriver'); отвечает java.lang.ClassNotFoundException:...

Кто-нибудь работал с Oracle JDeveloper???
Если кто работал хотелось бы обсудить некоторые вопросы олег

Кто работал с Word'ом из Бейсика помогите?
Такая проблема, допустим есть документ с метками и текстовыми полями на листе. Так вот из макроса Word'a доступ нет проблем ...

22
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.09.2008, 02:55
Помогаю со студенческими работами здесь

Если кто-то работал с видео в С++, подскажите.
Доброго всем времени суток! Не могу проиграть сжатый .avi( или любое видео) файл с возможностью управления воспроизведения. Пробовал с...

Уважаемые форумчане. Помогите с советом. С советом о жизни.
Здраствуйте.Уважаемые посетители форума.Заранее извиняюсь если не в том месте создал тему.Расскажу немножко о себе.Меня 25 лет.Живу в...

Как узнать, кто работал в заданное время и под какой учеткой
Помогите пжлста советом. Ситуация такая, файл был скачан с такой-то машины в таком-то кабинете и возможно вынесен на флешке. За этой...

Кто-ть работал с 1С под MySQL или Sybase SQL Anuwhere Server?
народ, вопрос такой: Кто-ть работал с 1С под MySQL или Sybase SQL Anuwhere Network Server? отзовитесь, пишите комменты. где можно...

Кто работал с BDE, помогите настроить доступ к Paradox через ODBC...
Если кто знает как настроить BDE, помогите пожалуйста! У меня есть приложение на Delphi, которое имеет свою БД Paradox. Мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru