![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| h4ck3r |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Здравствуйте. Делаю небольшую программку с использованием hibernate (программа для подсчета очков в ТЕННИС).
Сначала коротоко о программе: имеется 3 таблицы в БД: ТУРНИРЫ (айди, дата_турнира, название), УЧАСТНИКИ (айди, код_турнира,код_участника,количество_очков,место), и собственно таблица ИГРОКИ (айди, имя,фамилия,рейтинг и тд). Проблема в следующем: Нужно сделать относительно сложную табличку, в которой столбцами будут все турниры, которые были сыграны, а в строку соответственно всех игроков и количества очков по каждому турниру. реализовал таким образом: Проблема в том что при нажатии на соответсвующий пункт меню где-то секунд 20 все висит и потом только табличка появляется. Я реализовал тоже самое стандартным методом работой с базой (такой же запрос, только с использование sql) и табличка появляется секунды через 3. Я думаю что не может же хибер настолько "тормозить".Проблемы скорее всего в каких-то настройках или может еще в чем ? Подскажите, кто чем может =)
|
|||
|
||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Проблема здесь в том, что Hibernate после собственно исполнения самого запроса еще и скроллирует по результирующим записям для заполнения списка. Если записей много, то время может уходить на их передачу по сети. Способы решения есть: почитать здесь
-------------------- Aut viam inveniam aut faciam |
|||
|
||||
| h4ck3r |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Может я Вас неправильно понял, но запрос : "session.createQuery("from Participants where key_player = "+pl.getKeyPlayer()+" and key_tournament="+t.getKeyTournament()).list(); " может возвращать либо 1 строчку, либо ниодной.. Как бы так объяснить: имеется грубо говоря 100 строк (игроки) и 20 столбцов (турниры) и вот оно идет построчно по игрокам и ищет для конкретного игрока количество очков в конкретном турнире и так для всех.. То есть пока оно в цикле так обойдет по скажем 20 турниров для сотни игроков проходит как раз вот эти секунд 20 ожидания....Но таким же методом построенный запрос не через хибер делает это гораздо быстрее (секунды 3 и готово.) Еще у меня стоит у этой таблицы Lazy=false для двух других таблиц. т.е. возможно оно с собой еще какието данные подсасывает..Пробовал отключать - ничего не изменилось.Ну во всяком случае незначительно.. Просто не верится,что такая разительная разница во времени может быть..Наверняка что-то у меня неправильно или нерационально =( |
|||
|
||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Значит дело не Hibernate, а в том, что каждый раз вы подсовываете SQL серверу новый запрос с новыми данными и сервер каждый раз тратит время на парсирование/компиляцию по сути одного и того же запроса. Надо использовать PreparedStatement, чтобы сервер один раз скомпилировал запрос и потом подсовывал изменяемые данные. В идеологии Hibernate/HQL это выглядит примерно так:
-------------------- Aut viam inveniam aut faciam |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
1. Конфигурируем Hibernate Log4j Appender на показ всех SQL запросов и их параметров.
2. Берем выполненные SQL запросы и пробуем их выполнить из клиента и смотрим на время выполнения и количество возвращаемых данных. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| h4ck3r |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Я пишу в нетбинсе, там в настройках стоит вывод запросов всех..Так вот, выводит именно то что нужно:
Мне кажется что так долго то, что каждый раз для нового запроса создается сессия, потом сервер обрабатывает, потом сессия закрывается. В связи с этим попробовал переделать метод с запросом как-то так (чтобы обработать всех в одной сессии):
Но к сожалению, результат примерно тот же :( Что же не так ? Как эффективно обработать эту кучу одинаковых запросов ? |
||||
|
|||||
| fixxer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 14.9.2006 Где: Саратов, Россия Репутация: 6 Всего: 27 |
bound parameters? "where keyplayer = ?"
-------------------- ![]() |
|||
|
||||
| h4ck3r |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
А можно поподробнее. Я так понял вы предлагаете заменить Query("from Participants where key_player = "+pl.getKeyPlayer()+" and key_tournament="+t.getKeyTournament()) на Query("from Participants where key_player =? and key_tournament=?") ? Что это даст ? |
|||
|
||||
| stron |
|
|||
![]() Консультант ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1654 Регистрация: 17.7.2003 Где: Питер Репутация: нет Всего: 36 |
Это даст прирос производительности в базе.
С точки зрения базы эти запросы разные: select participan....where key_player=1 and key tournament=1 select participan....where key_player=1 and key tournament=2 поэтому рекомендуется использовать связные переменные, тогда база не будет каждый раз парсить SQL запрос и строить план выполнения. А вообще, надо
заменить на что-нибудь более простое Добавлено через 4 минуты и 19 секунд + есть подозрение, что на каждый SQL запрос открывается новый коннект к базе, что является "тяжелой" операцией одной сессии на все операции должно хватить Это сообщение отредактировал(а) stron - 10.11.2009, 00:31 -------------------- подписи нет |
|||
|
||||
| h4ck3r |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Вы знаете, попробовал отойти от хибернейта и сделал что-то как-то постаринке..Получилось вот так вот:
Как то не сильно красиво, но разница в работе в таком варианте 2-4 сек, а в вариантах всех что были выше 15-20.. Неплохая разница..Только както выглядит некрасиво , да и метод session.connection() deprecated. Тоже нехорошо. |
|||
|
||||
| stron |
|
||||
![]() Консультант ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1654 Регистрация: 17.7.2003 Где: Питер Репутация: нет Всего: 36 |
Попробуй как первый шаг использовать связные переменные,
И заменить openSession() на getCurrentSession() Добавлено через 4 минуты и 41 секунду
лучше на
через именнованные параметры проще поддерживать будет -------------------- подписи нет |
||||
|
|||||
| h4ck3r |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Что-то не хотят они почему то работать в таком виде:
И как правильно будет создать Statement? есть какойто вариант не через "зачеркнутые" методы ? |
|||
|
||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Я же говорил уже что надо использовать PreparedStatement А вообще зря вы от Hibernate отошли. Раз вы сами напрямую лезете в базу - на кой ляд он вам нужен? Тот же PreparedStatement можно реализовать средствами Hibernate (см. выше) -------------------- Aut viam inveniam aut faciam |
|||
|
||||
| h4ck3r |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.7.2009 Репутация: нет Всего: нет |
Если я вас правильно понял , то получилось у меня вот так:
Пришлось "извращаться" для скорости.Вот в том извращенном варианте таблица строится за 4 сек, а в том что как-бы вроде полюдски сделал(чуть выше) ~20 сек.. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |