Здравствуйте, XJava, Вы писали:
ДГ>>Здравствуйте, Cyberax, Вы писали: XJ>Если Eclipse написан с использованием SWT, то он рулить реально.
Дело в том, что в самом Eclipse не так уж много контролов используется. Если их хватает — все нормально.
Если же чего-то не хватает — то все плохо. Такие вещи, как тот же JScrollPane в Swing'е в SWT не делаются нормально вообще.
XJ>Когда-то я участвовал в крутом Swing проекте стоимостью в млн. $. XJ>Проект крутой и большой, но GUI тормозила ужасно.
Писали плохо
Sapienti sat!
Re[10]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, Cyberax, Вы писали:
XJ>>Когда-то я участвовал в крутом Swing проекте стоимостью в млн. $. XJ>>Проект крутой и большой, но GUI тормозила ужасно. C>Писали плохо
Или под ОЧЕНЬ старый JRE. И вообще, XJava, поищи хотя бы по этому форуму.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Дм.Григорьев,
B>>>А со Spring ты зря так. Какое там "время на изучение"? Там все просто, за пару часов можно IoC освоить. А остальное со временем прикрутится.
ДГ>>Я ждал этого замечания! Я развиваю уже работающий сайт, кто бы мне дал время его переписать. И есть у меня большое подозрение, что за пару часов всех ньюансов (в той же многопоточности) не освоишь. Кроме того, я тут вгрызаюсь в Swing, и боюсь, что параллельно ещё одно новшевство не потяну. (Всё чесались руки создать голосовалку: "Что такое — начинается на S, кончается на ing?" ) Вот и откладываю снова и снова.
LCR>Один мудрый человек говорил: вопрос нехватки времени — это вопрос расстановки приоритетов. (Это кстати вовсе не означает, что ты неправильно расставляешь приоритеты. Если времени на что-то не хватает — значит оно тебе не так уж и нужно).
LCR>Касаемо спринга вот этот (http://www.zaporozhye.org/rss/feed.php?channel=24&y=2006&m=08&d=05) пост мне очень нравится. Кстати, тебя никто не заставляет использовать именно spring. Можно ограничиться pico-, nano-контейнерами или Yan. Последний вообще можно прикрутить к чему угодно и куда угодно — совершенно неинтрузивен. Но конечно вокруг него нет такого хайпа, как вокруг спринга.
А что есть Yan? Не кинете ссылкой?
Re[5]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, XJava, Вы писали:
XJ>Когда-то я участвовал в крутом Swing проекте стоимостью в млн. $. XJ>Проект крутой и большой, но GUI тормозила ужасно.
На одном форуме проскакивало: переписали проект с JDBC на Hibernate — стало в 10 раз медленнее. Вывод — Hibernate в 10 раз медленнее JDBC. Вот и тут похожая ситуация.
Re[10]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, Blazkowicz, Вы писали:
B>На одном форуме проскакивало: переписали проект с JDBC на Hibernate — стало в 10 раз медленнее. Вывод — Hibernate в 10 раз медленнее JDBC. Вот и тут похожая ситуация.
В 10 раз это преуменьшение. Я бы сказал в 1000 раз Вот я выложил результат запуска профайлера для чтения 1'000 объектов. JDBC calls 20мс из 5,5 тыс. мс. Подавляющее большинство времени занимает работа самого фреймворка. Самое интересное, что при росте числа объектов, обрабатываемых в одной сессии тормоза растут далеко не линейно! При том это не только моё мнение. Вот свежий пример сумнящегося в масштабируемости хибернейта. А вот бяка, которая вылазит при наличии L2-кеша и желания вставить/изменить много объектов. В результате выходит, что пока ты в работаешь с одним объектом, всё хорошо. А если тебе нужно массово обработать объекты, то с Хибом добро пожаловать в АдЪ Попытки исправить всё в лоб — больше загружать через lazy-load могут очень очень ухудшить положение. Любые попытки распаралелить обработку — это либо по сессии на тред и кардинальный рост занятой памяти плюс накладные расходы на вычитку объектов в разных тредах, либо попытка всё вычитать один раз и обрабатывать в разных тредах, тогда добро пожаловать в поисх ошибок связанных с ленивыми прокси. В этом случае LazyInitializationException — это большая удача, а всё может стать хитрее.
(цитата: "жалкие полтыщи /.../ строк должны загружаться по три-пять секунд") дело тут не только в Хибернейте. Как я помню, то при использовании ORM в Smalltalk (Glorp for VW) данные читались медленно (St всё таки ), но быстрее чем сейчас через Хибернейт (Это на PII-350 с 64Mb тогда против Core Duo 6600 с 2Гб сейчас)! Могу предположить, что дело в стоимости рефлексии (которую почему то считают ооочень быстрой в Java).
В итоге, я вполне допускаю, что готовить я Хибер просто не умею, но продукт, который призван что-то облегчать должен быть проще в готовке.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>В 10 раз это преуменьшение. Я бы сказал в 1000 раз Вот я выложил результат запуска профайлера для чтения 1'000 объектов. JDBC calls 20мс из 5,5 тыс. мс. Подавляющее большинство времени занимает работа самого фреймворка. Самое интересное, что при росте числа объектов, обрабатываемых в одной сессии тормоза растут далеко не линейно!
Больше похоже на какие-то слишком жуткие глюки. Надеюсь, ты измерения проводил на "прогретом" коде?
ANS>При том это не только моё мнение. Вот свежий пример сумнящегося в масштабируемости хибернейта. А вот бяка, которая вылазит при наличии L2-кеша и желания вставить/изменить много объектов. В результате выходит, что пока ты в работаешь с одним объектом, всё хорошо. А если тебе нужно массово обработать объекты, то с Хибом добро пожаловать в АдЪ
Ага, натыкался. Почему-то их ассемблер объектов сильно тормозит в некоторых паталогических случаях с custom-типами. Причем СИЛЬНО тормозит.
ANS>Судя по наличию такой проблемы у соседей по палате, э-э т.е. платформе
(цитата: "жалкие полтыщи /.../ строк должны загружаться по три-пять секунд") дело тут не только в Хибернейте. Как я помню, то при использовании ORM в Smalltalk (Glorp for VW) данные читались медленно (St всё таки ), но быстрее чем сейчас через Хибернейт (Это на PII-350 с 64Mb тогда против Core Duo 6600 с 2Гб сейчас)! Могу предположить, что дело в стоимости рефлексии (которую почему то считают ооочень быстрой в Java).
Рефлексия ОЧЕНЬ быстрая, да еще и ускорить ее можно с помощью reflection optimizer'а. Можешь сам проверить — создание пары миллионов объектов с помощью рефлексии происходит очень быстро.
ANS>В итоге, я вполне допускаю, что готовить я Хибер просто не умею, но продукт, который призван что-то облегчать должен быть проще в готовке.
Так ведь облегчает Иначе никто бы им не пользовался.
Я был на JUG'е где Mike Keith пиарил http://www.eclipse.org/eclipselink/ Сейчас я на него смотрю — вроде бы примерно на уровне Hibernate фичи и работает быстрее. Можно попробовать его еще.
Sapienti sat!
Re[12]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, Cyberax, Вы писали:
C>Больше похоже на какие-то слишком жуткие глюки. Надеюсь, ты измерения проводил на "прогретом" коде?
Верю, но что делать — так и не понятно Это, кстати, синтетический тест. А в реале всё еще хуже
C>Ага, натыкался. Почему-то их ассемблер объектов сильно тормозит в некоторых паталогических случаях с custom-типами. Причем СИЛЬНО тормозит.
Там не только ассемблер. Если вычитать в сессии много объектов, а потом вне транзакции делать find(), то всё — туши свет.
C> ускорить ее можно с помощью reflection optimizer'а
Этого? ;)
C>Так ведь облегчает Иначе никто бы им не пользовался.
Возникло просто сомнение, что им кто-то пользуется Никаких советов, кроме использования pre-fetching-а и L2-кеша для ускорения пообъектного доступа я особо не видел. И то этот совет слишком банальный. А при любых указаниях на тормоза один ответ — у нас всё хорошо, а вот вам не нужно столько объектов за раз. Спасибо, хоть ты такого не сказал
C>Я был на JUG'е где Mike Keith пиарил http://www.eclipse.org/eclipselink/ Сейчас я на него смотрю — вроде бы примерно на уровне Hibernate фичи и работает быстрее. Можно попробовать его еще.
Это же toplink. Говорят он такой глючный, что мне даже смотреть на него боязно
Здравствуйте, Cyberax, Вы писали:
ANS>>В итоге, я вполне допускаю, что готовить я Хибер просто не умею, но продукт, который призван что-то облегчать должен быть проще в готовке.
+1.
C>Так ведь облегчает Иначе никто бы им не пользовался.
ИМХО, Hibernate отнюдь не производит впечатление интуитивно-понятной вещи, даже на уровне юзера. Вот допустим есть у меня замапенный List<MenuItem> Menu.items, <list><list-index></list> в Menu.hbm.xml, и <many-to-one> в MenuItem.hbm.xml. Если в <many-to-one> забыть not-null="true", маппинг работать не будет. Молча. Я дважды наступал на эти грабли, и парился по часу, всё проклиная. Кто скажет, что такой простой use case нельзя было сделать по-человечески, пусть первый бросит в меня камень.
C>Я был на JUG'е где Mike Keith пиарил http://www.eclipse.org/eclipselink/ Сейчас я на него смотрю — вроде бы примерно на уровне Hibernate фичи и работает быстрее. Можно попробовать его еще.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
C>>Больше похоже на какие-то слишком жуткие глюки. Надеюсь, ты измерения проводил на "прогретом" коде? ANS>Верю, но что делать — так и не понятно Это, кстати, синтетический тест. А в реале всё еще хуже
Попробуй с дебаггером залезть внутри Hibernate
Кстати, еще же JDO есть — попробуй на досуге benchmark'и поделать на нем. По идее, он тебе должен больше подходить.
C>>Ага, натыкался. Почему-то их ассемблер объектов сильно тормозит в некоторых паталогических случаях с custom-типами. Причем СИЛЬНО тормозит. ANS>Там не только ассемблер. Если вычитать в сессии много объектов, а потом вне транзакции делать find(), то всё — туши свет.
Странно, у меня это работает быстро.
C>> ускорить ее можно с помощью reflection optimizer'а ANS>Этого? ;)
Ага
C>>Так ведь облегчает Иначе никто бы им не пользовался. ANS>Возникло просто сомнение, что им кто-то пользуется Никаких советов, кроме использования pre-fetching-а и L2-кеша для ускорения пообъектного доступа я особо не видел. И то этот совет слишком банальный. А при любых указаниях на тормоза один ответ — у нас всё хорошо, а вот вам не нужно столько объектов за раз. Спасибо, хоть ты такого не сказал
Я пользуюсь L2-кэшем. Специально даже его пинал ногами, чтоб работал — время, действительно, экономит. Но у меня проблема в том, что есть куча сложносвязаных объектов, для загрузки которых потребовалось бы много мелких запросов к БД.
C>>Я был на JUG'е где Mike Keith пиарил http://www.eclipse.org/eclipselink/ Сейчас я на него смотрю — вроде бы примерно на уровне Hibernate фичи и работает быстрее. Можно попробовать его еще. ANS>Это же toplink. Говорят он такой глючный, что мне даже смотреть на него боязно
Да, это бывший Toplink. Не знаю как насчет глючности, но мне в нем понравилось то, что они умеют "из коробки" представлять набор изменений в транзакции в виде красивых changeset'ов. В Hibernate для этого я делал грязные хаки.
Пока я на него переходить не хочу, подожду еще годик, чтобы он подрос (или умер окончательно). Пока мне слишком нравится поддержка Hibernate в IDEA
Sapienti sat!
Re[13]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, Дм.Григорьев, Вы писали:
ДГ>ИМХО, Hibernate отнюдь не производит впечатление интуитивно-понятной вещи, даже на уровне юзера. Вот допустим есть у меня замапенный List<MenuItem> Menu.items, <list><list-index></list> в Menu.hbm.xml, и <many-to-one> в MenuItem.hbm.xml. Если в <many-to-one> забыть not-null="true", маппинг работать не будет. Молча. Я дважды наступал на эти грабли, и парился по часу, всё проклиная. Кто скажет, что такой простой use case нельзя было сделать по-человечески, пусть первый бросит в меня камень.
Меня больше бесили странные сообщения об ошибках. Точнее, их отсутсвтие — Hibernate просто падает в середине какого-либо метода.
Sapienti sat!
Re[14]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, Cyberax, Вы писали:
C>Кстати, еще же JDO есть — попробуй на досуге benchmark'и поделать на нем.
Попробуй лучше ты попрофайлить вычитывание списка в 1'000-10'000 элементов в Hibernate. Вопрос, кстати, не теоретический, а именно практический.
C>По идее, он тебе должен больше подходить.
Может и так. Вообще я понимаю. что наезд не совсем в кассу. Пишут же люди на ROR и не жужжат. Но там они знают на что идут и от Жабы я ожидал большей масштабируемости чем от Ruby
C>Странно, у меня это работает быстро.
Там 2 прикола. Если вызывать find() вне транзакции, то в обязательном порядке для всех объектов в сессии вызывается некий unlock (см. SessionImpl.get() -> SessionImpl.afterOperation(); возможно потом StatefulPersistenceContext.afterTransactionCompletion(), не помню точно). Вот, судя по профайлеру сам процесс итерации по всем entries и тормозит! Если этих find-ов больше одного, то заметно тормозит И хоть стой хоть падай, а время этой итерации не знаю как сократить. Точнее знаю — нужно все find вызывать в транзакции. Но если в сессии много объектов, то завершение транзакции (поисх изменённых объектов) занимает кучу времени!
Второй прикол с find() вылазит если все find() таки делать в одной транзакции. Оказывается доставание уже вычитанного (закешированного в сессии) объекта тоже относительно медленная операция (хотя я не помню это было принципиально или нет).
Иллюстрация (1'000 find):
Выход — не использовать find(), а ходить по связям в объектах. Правда каждая связь добавляет сущность, которая ляжет в сессию...
C>Я пользуюсь L2-кэшем. Специально даже его пинал ногами, чтоб работал — время, действительно, экономит.
Пользуемся EhCache, (afaik ) Тоже не быстрая штука
C>Но у меня проблема в том, что есть куча сложносвязаных объектов, для загрузки которых потребовалось бы много мелких запросов к БД.
Угу. А если делать pre-fetch, то мало того, что вычитываются возможно не нужные объекты, но и сессия засерается с вытекающими отсюда тормозами.
C>Пока я на него переходить не хочу, подожду еще годик, чтобы он подрос (или умер окончательно). Пока мне слишком нравится поддержка Hibernate в IDEA
В любом случае у нас много гибернетизмов Нет уверенности, что легко запустить будет под toplink/eclipselink.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>>Иллюстрация (1'000 find): ANS>Туда же: ANS> ANS>п.2,3,4 входят в состав п.1
О, спасибо, это интересно. Я искал только баги по 3.2.3+. Ровно 2 года с момента репорта
Решение в общем почти то же, что у мужика в баге. Сделали по максимум доступ через ссылки в уже загруженных объектах, плюс доп-кеширование на уровне сессии. Но когда вводили гибернейт, то было желание избавиться от наших кешей, а не перенаворачивать их сверху хибернейта С find() ожидалось, что не будет проблем c владением объектами (когда объект с ленивыми проксями передаётся в другой тред. Ан нет — и кеши свои пришлось приделать и проблемы с владением решать.
Кстати, похоже в баге там еще не все условия указаны. Нужно что-бы jdbc-конекшен релизился из сессии после транзакции/запроса (releaseMode). Если конекшен не релизится в течение жизни хиб-сессии, то вроде проблемный метод не вызывается.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
C>>Кстати, еще же JDO есть — попробуй на досуге benchmark'и поделать на нем. ANS>Попробуй лучше ты попрофайлить вычитывание списка в 1'000-10'000 элементов в Hibernate. Вопрос, кстати, не теоретический, а именно практический.
Обязательно попробую на досуге.
C>>Странно, у меня это работает быстро. ANS> Но если в сессии много объектов, то завершение транзакции (поисх изменённых объектов) занимает кучу времени!
Это можно переопределить при желании — нужно поставить Interceptor в котором добавить свою обработку onFlushDirty.
ANS>Второй прикол с find() вылазит если все find() таки делать в одной транзакции. Оказывается доставание уже вычитанного (закешированного в сессии) объекта тоже относительно медленная операция (хотя я не помню это было принципиально или нет).
Можно попробовать исправить
C>>Я пользуюсь L2-кэшем. Специально даже его пинал ногами, чтоб работал — время, действительно, экономит. ANS>Пользуемся EhCache, (afaik ) Тоже не быстрая штука
У меня хуже — распределенный JBoss Cache
C>>Но у меня проблема в том, что есть куча сложносвязаных объектов, для загрузки которых потребовалось бы много мелких запросов к БД. ANS>Угу. А если делать pre-fetch, то мало того, что вычитываются возможно не нужные объекты, но и сессия засерается с вытекающими отсюда тормозами.
У меня оно еще просто и очень сложно делается.
C>>Пока я на него переходить не хочу, подожду еще годик, чтобы он подрос (или умер окончательно). Пока мне слишком нравится поддержка Hibernate в IDEA ANS>В любом случае у нас много гибернетизмов Нет уверенности, что легко запустить будет под toplink/eclipselink.
Просто они, вроде бы, очень похожи. В общем, интересно посмотреть что получится из Eclipselink в итоге. Hibernate'у уже давно пора хорошего конкуррента получить.
Sapienti sat!
Re[16]: Нормальная объектная декомпозиция vs EJB 3.
Здравствуйте, Cyberax, Вы писали:
ANS>> Но если в сессии много объектов, то завершение транзакции (поисх изменённых объектов) занимает кучу времени! C>Это можно переопределить при желании — нужно поставить Interceptor в котором добавить свою обработку onFlushDirty.
так если тебе нужно найти изменённые, то кроме как всё оббежать, именно в хибернейте по другому никак. или "как"?
Кстати, странно, что кеши (L1 & L2) не кешируют отсутсвтие объектов.
Здравствуйте, Cyberax, Вы писали:
C>Рефлексия ОЧЕНЬ быстрая, да еще и ускорить ее можно с помощью reflection optimizer'а. Можешь сам проверить — создание пары миллионов объектов с помощью рефлексии происходит очень быстро.
Хе-хе. Так мысль, что дело в рефлексии была появилась, когда заметили, что если смотреть стек-трейс тредов обработки данных из БД, то в 90% случаев всё стоит в AbstractEntityTuplizer и дальше java.lang.reflect. Эдакий ручной профайлер
Но, похоже, что вызов гетера через рефлексию всего в три раза медленнее прямого вызова метода. А Хиб сверху донаворачивает оверхеда еще на порядок.
Иллюстрация:
Но эти тормоза обошли просто вытащив реальный объект из прокси. А вот медленную вычитку — никак