|
|
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
Добрый день ! Исходные данные: Hibernate 2.1.8 и MySQL Если формируется приличный объем данных для постраничного показа (допустим 40 страниц по 40 строчек и каждая строка состоит из BigDecimal, 5-ти String, Integer) и таких запросов одновременно может быть 2-3 То выживет ли Hibernate ? Нет ли у него утечек памяти ? Насколько он хуже по скорости работы, если просто выкачать выбору в List и передать ее Bean. Интересно знать мнение бывалых спецов. Спасибо заранее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 11:17 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
постраничный показ делать строго с пейджингом результата выборки использовать lazy loading, т.е. session закрывать по завершении отрисовки всех view надрочить кеширование выживет :) just another freak in the Freak Kingdom ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 13:55 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
но лучше конечно hibernate 3 - двуха старье just another freak in the Freak Kingdom ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 13:56 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
Спасибо большое, авторстрого с пейджингом но не проясните, это как ? недогоняю в терминах ;( Если lazy loading , то придется сначала селектом узнать, сколько страниц получится в выборке. Может лучше все сразу засосать, и гонять List туда-сюда. Память то не сильно уйдет с учетом кол-ва одновременных запросов. С Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 16:07 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
galishaДобрый день ! То выживет ли Hibernate ? Нет ли у него утечек памяти ? Насколько он хуже по скорости работы, если просто выкачать выбору в List и передать ее Bean. Выживет. Утечек не бывает. Но если хотите в каждую отдельную страницу помещать 40 записей, то читайте только эти 40 - зачем 40* 40 всякий раз читать?... Вот как я это делаю: Код: plaintext 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. Здесь int start - начальная позиция в списке, int pageSize - размер страницы, List dest - буфер выбранных записей (класса AccountTransaction). Сначала делаем выборку идентификаторов (значений первичного ключа), потом достаем нужные записи. Возвращаемое значение - hasNext - тоже немаловажно. Если оно true, занчит, есть еще записи, и в форме, показывающей список, можно показать кнопочку "Следующие". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 17:40 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
Спасибо большое ! То что List можно заполнить отдельно (не затрагивая Hibernate SQL) и затем захлопнуть сессию - это я как то не додумался. Спасибо, что просветили насчет утечек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 18:12 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
вообще я для постраничного просмотра пользуюсь Query Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2005, 12:19 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
galisha Если lazy loading , то придется сначала селектом узнать, сколько страниц получится в выборке. Может лучше все сразу засосать, и гонять List туда-сюда. Память то не сильно уйдет с учетом кол-ва одновременных запросов. Если лист вырисуется больше 10,000 записей, на 1Гб памяти и JBoss'е падает в out of memory, хоть ты iterate'ом делай с flush'ем, хоть еще как. Paging однозначно, без вариантов. Более того. Как ты представляешь себе огромный лист туда сюда гонять? Пока маленький проблем нет. А большой? Та ну нах. galisha С Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;) Недавно проект смигрейтил с 2.1.8 за 3-ий. Никаких проблем. Во втором больше мелочей ненужных, которых в 3-ем нет. Нафиг изначально заморачиваться со старьем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2005, 23:34 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
vas0вообще я для постраничного просмотра пользуюсь Query Да, это проще. В коде. В исполнении код будет извлекать записи, пока не достигнет beginIndex. Заметьте, ПОЛНЫЕ ЗАПИСИ. Это не так дешево, как кажется. В моем случае до start и затем от start до start + pageSize - 1 извлекаются только ID (1 поле). Представьте, что у вас 10000 записей, и вам надо достать с 5000-й по 5049-ю. У вас впустую зачитаются 4999 ПОЛНЫХ записей, затем с пользой дела зачитаются 50. В моем случае зачитаются 4999 "бесполезных" ID, затем 50 "полезных" и 50 записей. Большая разница. То есть проще не значит лучше. Кроме того, писать Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2005, 23:44 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
ZelenНедавно проект смигрейтил Правильнее сказать "смайгрейтил" (migrate произносится как "майгрэйт"). Можно еще "мигранул" (от русского "мигрировать"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2005, 23:54 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов Кроме того, писать Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2005, 07:42 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
vas0p М.Голованов Понятно, почему?...нет Объясняю. Вы просто складываете 4 строки. Код будет работать так. 1. Выделится буфер под сумму 1 и 2 строк. 2. Они по очереди скопируются в него. Это буфер 1-2. 3. Выделится буфер по сумму 1-2 и 3 строк. 4. Они по очереди скопируются в него. Это буфер 1-2-3. 5. Выделится буфер по сумму 1-2-3 и 4 строк. 6. Они по очереди скопируются в него. Это буфер 1-2-3-4 - то есть результат операции. Итого последовательно выделяются 3 буфера и выполняется копирование 6 строк. При использовании StringBuffer: 1. Создастся объект. 2. запомнится ссылка на 1-ю строку. 3. запомнится ссылка на 2-ю строку. 4. запомнится ссылка на 3-ю строку. 5. запомнится ссылка на 4-ю строку. 6. Выделится буфер под сумму всех строк. Строки 1-4 по очереди скопируются в него - это будет результат. Экономия на выделениях памяти и копированиях строк очевидна. Для 4-х склеиваемых строк она будет не так велика, но если вы склеиваете их десятками (что не так уж редко при конструировании SQL и Hibernate запросов в коде Java), выигрыш будет весьма ощутим. http://builder.com.com/5100-6373-5031999.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2005, 11:06 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
galishaС Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;) обязательно используйте hibernate annotations - это избавляет от трудоемких ревизий xml-маппингов при любом изменении модели данных. если работаете в eclipse, то используйте свежую JBoss IDE (aka Hibernate Tools), там достаточно удобные средства реверса из rdbms в маппинг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2005, 15:46 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
котыобязательно используйте hibernate annotations - это избавляет от трудоемких ревизий xml-маппингов при любом изменении модели данных. Да-да, обязательно!... А еще лучше используйте XDoclet - тогда XML mappings будут генериться вообще автоматически... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2005, 22:36 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов vas0p М.Голованов Понятно, почему?...нет Объясняю. Вы просто складываете 4 строки. Код будет работать так. 1. Выделится буфер под сумму 1 и 2 строк. 2. Они по очереди скопируются в него. Это буфер 1-2. 3. Выделится буфер по сумму 1-2 и 3 строк. 4. Они по очереди скопируются в него. Это буфер 1-2-3. 5. Выделится буфер по сумму 1-2-3 и 4 строк. 6. Они по очереди скопируются в него. Это буфер 1-2-3-4 - то есть результат операции. Итого последовательно выделяются 3 буфера и выполняется копирование 6 строк. При использовании StringBuffer: 1. Создастся объект. 2. запомнится ссылка на 1-ю строку. 3. запомнится ссылка на 2-ю строку. 4. запомнится ссылка на 3-ю строку. 5. запомнится ссылка на 4-ю строку. 6. Выделится буфер под сумму всех строк. Строки 1-4 по очереди скопируются в него - это будет результат. Экономия на выделениях памяти и копированиях строк очевидна. Для 4-х склеиваемых строк она будет не так велика, но если вы склеиваете их десятками (что не так уж редко при конструировании SQL и Hibernate запросов в коде Java), выигрыш будет весьма ощутим. http://builder.com.com/5100-6373-5031999.html я пошутил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 00:18 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов Кроме того, писать Код: plaintext Код: plaintext согласен не качественно , но в конкретно в этом случае первый вариант смотрится более понятно imho, а сопровождать "понятный" код легче и я иногда жертвую для этого производительностью. что касается Query, я с hibernate еще не "ты", поэтому написал свой вариант, чтобы услышать что в нем плохого :). vas0p не надо под меня косить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 06:46 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
Подскажите как сделать пэйджинг используя Criteria API. Трабл в том, что для того чтобы узнать сколько всего страниц нужно определить сколько всего записей возвратит поисковый запрос. criteria.list().size? criteria.list(); Пока реализовано так. Что будет когда посисковый запрос будет возвращать к примеру 100000 записей при использовании строки:criteria.list().size? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 08:01 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов ZelenНедавно проект смигрейтил Правильнее сказать "смайгрейтил" (migrate произносится как "майгрэйт"). Можно еще "мигранул" (от русского "мигрировать"). :-) Считайте что это микс русского и нерусского. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 21:00 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов vas0вообще я для постраничного просмотра пользуюсь Query Да, это проще. В коде. В исполнении код будет извлекать записи, пока не достигнет beginIndex. Заметьте, ПОЛНЫЕ ЗАПИСИ. Это не так дешево, как кажется. В моем случае до start и затем от start до start + pageSize - 1 извлекаются только ID (1 поле). Вот здесь можно поподробнее? Почему Вы думаете что он будет извлекать "пустые" (всмысле "ненужные") записи вообще? Если мне не изменяет память, то как минимум в Hibernate3, указанные команды (выше vas0 вроде) -- в SQL превратятся в нечто "limit X, Y", где X - сколько тянуть, а Y - offset. Что ни при каком раскладе не сделает чтобы база вытягивала "ненужные" записи. Действительно интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 21:03 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
Zelen М.Голованов[quot vas0]вообще я для постраничного просмотра пользуюсь Query Вот здесь можно поподробнее? Почему Вы думаете что он будет извлекать "пустые" (всмысле "ненужные") записи вообще? Если мне не изменяет память, то как минимум в Hibernate3, указанные команды (выше vas0 вроде) -- в SQL превратятся в нечто "limit X, Y", где X - сколько тянуть, а Y - offset. Что ни при каком раскладе не сделает чтобы база вытягивала "ненужные" записи. В принципе вы правы. Товарищ использует MySQL, а он реализует LIMIT, поэтому уже как минимум Hibernate 2.1.* будет исполнять код, приведенный vas0, корректно и "лишние" записи извлекаться не будут. Все верно. Мой код не зависит от того, поддерживает ли СУБД LIMIT или нет. В случае же конкретно MySQL, Oracle, MS SQL следует использовать setFirstResult / setMaxResults. Для этих (и практически всех остальных СУБД за редким исключением) соответствующий Hibernate Dialect имеет Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2005, 11:05 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов Кроме того, писать Код: plaintext Код: plaintext разве первое при компиляции во второе не превращается? http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html String buffers are used by the compiler to implement the binary string concatenation operator +. For example, the code: x = "a" + 4 + "c" is compiled to the equivalent of: x = new StringBuffer().append("a").append(4).append("c") .toString() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2005, 18:26 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
klopuaразве первое при компиляции во второе не превращается? http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html String buffers are used by the compiler to implement the binary string concatenation operator +. Все верно. Превращается. Я извиняюсь, но я имел в виду несколько другое - преимущества привычки явно использовать StringBuffer при составлении динамических SQL - запросов. Да, в рассмотренном выше случае нет необходимости явно использовать StringBuffer - он будет использован неявно, и выигрыша не будет никакого. А вот другой пример: String queryStr = "from " + className; if( condition != null ){ queryStr += " " + condition; } if( order != null ){ queryStr += " " + order; } Нетрудно видеть, что в этом случае код StringBuffer query = new StringBuffer( "from " ).append( className ); if( condition != null ){ query.append( " " ).append( condition ); } if( order != null ){ query.append( " " ).append( order ); } String queryStr = query.toString(); будет в общем эффективнее. А по жизни приходится составлять куда более "кудрявые" запросы. То есть я хотел сказать, что в принципе лучше привыкать использовать StringBuffer при склеивании строк всегда. Разница в нотации (количестве нажатий кнопок клавиатуры) невелика, зато не надо думать, что вот в этом случае сойдет, а вот в этом надо бы так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2005, 21:20 |
|
||
|
Hibernate 2.1.8 Большие WEB выборки, как работает ?
|
|||
|---|---|---|---|
|
#18+
М.Голованов Мой код не зависит от того, поддерживает ли СУБД LIMIT или нет. В случае же конкретно MySQL, Oracle, MS SQL следует использовать setFirstResult / setMaxResults. Для этих (и практически всех остальных СУБД за редким исключением) соответствующий Hibernate Dialect имеет А стоит ли так извращать код (делать его более трудночитаемым как в Вашем случае), расчитывая на откровенно weak базы данных? :-) Хотя конечно это зависит от назначений application, но все таки если так ориентироваться на базы, то лучше не Hibernate использовать, а прямо JDBC :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 07:41 |
|
||
|
|

start [/forum/search_topic.php?author=Smirnoff_Sergey&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 421ms |
| total: | 592ms |

| 0 / 0 |
