Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySql и Hibernate, как такое объяснить? 
:(
    Опции темы
unkis
  Дата 2.5.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Ребята, задача заключается в следующем:

Надо в БД сохранить 800000 объектов.

Интересное начинается после 200000 объектов, жёсткий диск крутится без перерыву, нагрузка на процессор нулевая. до этого(до 200000) нагрузка на процессор была 100%.

После некоторого времени, жёсткий диск останавливается(почти останавливается),  и нагрузка на процессор опять 100% и потом опять падает и так продолжается и продолжается.

Производительность падает в разы. вопрос что же это за хрень такая? Может кто-то с подобным сталкивался?



--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 2.5.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Сохранение выполняется одной транзакцией или операция на несколько разбита?
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
Дата 2.5.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



одной


--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 2.5.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(unkis @  2.5.2007,  19:19 Найти цитируемый пост)
одной 

Когда ты выполняешь операции изменения записей, СУБД накапливает эти изменения в памяти (ей ведь надо либо зафиксировать все сразу либо откатить). Отсюда и своп. Разбей операцию на несколько транзакций.
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
  Дата 3.5.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Спасибо но проблема ещё вот в чём

у меня перед каждой вставкой идйт обращение к базе с выборкой,

вот так выглядит код



Код

for (RequestLocation location1 : requestLocationList) {
                    Location location =entityManager.find(Location.class,location1.getLocation().getLocation_id());
                    if (location == null) {
                    entityManager.persist(location1.getLocation());
                    entityManager.persist(location1);
                    }else{
                        location1.setLocation(location);
                        entityManager.persist(location1);
                    }
                }



то есть перед каждой вставкой, он проверяет существует ли такая запись или нет.



Код

Location location =entityManager.find(Location.class,location1.getLocation().getLocation_id());



и я так понимаю что база просто не знает что делать сохранять или выбирать, и поэтому происходит такой конфликт.

Что посоветуете по этому поводу?

Это сообщение отредактировал(а) unkis - 3.5.2007, 13:02


--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 4.5.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(unkis @  3.5.2007,  12:44 Найти цитируемый пост)
и я так понимаю что база просто не знает что делать сохранять или выбирать, и поэтому происходит такой конфликт.

Это, извиняюсь, как? Ты попросил MySQL вернуть запись с нужным первичным ключом, а она не поняла и решила что-то там сохранить? Это что за искусственный интеллект? Чего это MySQL тебя не слушается? Выбрось такую СУБД.

Цитата(unkis @  3.5.2007,  12:44 Найти цитируемый пост)
Что посоветуете по этому поводу?

Каждый из 800000 объектов ты пытаешься получить из базы. Видимо таких объектов в базе довольно много. Каждый из них хранится в кэше сессии. Вот тебе еще одна причина расходования памяти. Возможны следующие пути решения:
  • разбиение одной транзакции на несколько. Я уже предлагал, видимо тебя по каким-то причинам не устраивает
  • проверять существует ли объект в базе используя select count(*) from ..., если существует, тогда создавать объект и сохранять, если нет, то выполнять update ...
И прочитай внимательнее в документации к Hibernate раздел "Batch processing".
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
  Дата 4.5.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(tux @  4.5.2007,  07:15 Найти цитируемый пост)
Это, извиняюсь, как? Ты попросил MySQL вернуть запись с нужным первичным ключом, а она не поняла и решила что-то там сохранить? Это что за искусственный интеллект? Чего это MySQL тебя не слушается? Выбрось такую СУБД.


Да нет она слушается, просто для неё наверно выборка длится слишком долго, так как если отключить проверку и ещё кое где поменять то процесс идёт очень быстро, но мне нужна такая проверка.



Цитата(tux @  4.5.2007,  07:15 Найти цитируемый пост)
Каждый из 800000 объектов ты пытаешься получить из базы. Видимо таких объектов в базе довольно много. Каждый из них хранится в кэше сессии. Вот тебе еще одна причина расходования памяти.


в этом была проблема, я отключил кэш, и каждые 5000 делаю 
Код

entityManager.flush();
entityManager..clear();



Цитата(tux @  4.5.2007,  07:15 Найти цитируемый пост)
разбиение одной транзакции на несколько. Я уже предлагал, видимо тебя по каким-то причинам не устраивает


пробывал, писал каждые 5000
Код

bx2.comit();
bx2.begin();

эффекта никакого, тоже после 20000 тысяч начинется, жёсткий диск крутится без перерыву, нагрузка на процессор нулевая.



Цитата(tux @  4.5.2007,  07:15 Найти цитируемый пост)
проверять существует ли объект в базе используя select count(*) from ..., если существует, тогда создавать объект и сохранять, если нет, то выполнять update ...


1) а как я могу при помощи count(*) проверить существует ли объект, если он только считает.
2) и второе даже если он существует, то мне его надо вытащить и присвоить промежуточной таблицы и сохранить.
3) и почему entityManager.find(Location.class,location1.getLocation().getLocation_id()); не подходит?


Цитата(tux @  4.5.2007,  07:15 Найти цитируемый пост)
И прочитай внимательнее в документации к Hibernate раздел "Batch processing". 


да уже в роди в зад и вперёд прочитал, неужели что-то пропустил, если сохранять просто обекты без выборки, то проблем нет(проверял) он сохраняет и очень даже быстро, но вот когда делаешь проверку то и происходит выше описанная проблема. 



--------------------
www.unkis.com
PM MAIL WWW   Вверх
tux
Дата 4.5.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(unkis @  4.5.2007,  10:22 Найти цитируемый пост)
а как я могу при помощи count(*) проверить существует ли объект, если он только считает.

Если до одного посчитает, значит существует. Хайтек такой.

Цитата(unkis @  4.5.2007,  10:22 Найти цитируемый пост)
и второе даже если он существует, то мне его надо вытащить и присвоить промежуточной таблицы и сохранить.

Как я вижу из кода, тебе нужно только одно поле изменить, зачем тебе весь объект?

Цитата(unkis @  4.5.2007,  10:22 Найти цитируемый пост)
и почему entityManager.find(Location.class,location1.getLocation().getLocation_id()); не подходит?

Потому и не подходит, что грузит весь объект в память. Зачем это нужно если можно только обновить поле, не тратя память совсем.
PM MAIL Skype GTalk Jabber YIM   Вверх
unkis
  Дата 4.5.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Цитата(tux @  4.5.2007,  09:21 Найти цитируемый пост)

Потому и не подходит, что грузит весь объект в память. Зачем это нужно если можно только обновить поле, не тратя память совсем. 

да только мне не нужно, не обновлять поле, а нужно вставить новый объект, ссылающийся не на новый объект, а на уже имеющийся в БД



--------------------
www.unkis.com
PM MAIL WWW   Вверх
AntonSaburov
Дата 4.5.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118



Цитата(unkis @  4.5.2007,  12:31 Найти цитируемый пост)
да только мне не нужно, не обновлять поле, а нужно вставить новый объект, ссылающийся не на новый объект, а на уже имеющийся в Б

Если у тебя связь между объектами lazy, то тогда можно давать в качестве аргумента не полный объект location, а пустой, у которого установлен тольео первичный ключ - можно создать конструктор для Location с одним аргументом.

И тогда установка location можно прописать вот так

location1.setLocation(new Location(location1.getLocation().getLocation_id());

Это конечно просто набросок - посмотри сам внимательнее.
PM MAIL WWW ICQ   Вверх
unkis
  Дата 4.5.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 802
Регистрация: 8.9.2004

Репутация: нет
Всего: 1



Сейчас не могу попробывать, попробую вечером.

А вы бы не могли мне объяснить за что отвечает атрибут lazy?


--------------------
www.unkis.com
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.