powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate 2.1.8 Большие WEB выборки, как работает ?
23 сообщений из 23, страница 1 из 1
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33372991
galisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день !

Исходные данные: Hibernate 2.1.8 и MySQL

Если формируется приличный объем данных для постраничного показа (допустим 40 страниц по 40 строчек и каждая строка состоит из BigDecimal, 5-ти String, Integer) и таких запросов одновременно может быть 2-3

То выживет ли Hibernate ?
Нет ли у него утечек памяти ?
Насколько он хуже по скорости работы, если просто выкачать выбору в List и передать ее Bean.

Интересно знать мнение бывалых спецов.

Спасибо заранее
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33373650
коты
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
постраничный показ делать строго с пейджингом результата выборки
использовать lazy loading, т.е. session закрывать по завершении отрисовки всех view
надрочить кеширование

выживет :)

just another freak in the Freak Kingdom
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33373654
коты
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но лучше конечно hibernate 3 - двуха старье

just another freak in the Freak Kingdom
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33374110
galisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое,

авторстрого с пейджингом
но не проясните, это как ? недогоняю в терминах ;(

Если lazy loading , то придется сначала селектом узнать, сколько страниц получится в выборке. Может лучше все сразу засосать, и гонять List туда-сюда. Память то не сильно уйдет с учетом кол-ва одновременных запросов.

С Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;)
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33374357
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
   public   boolean  getAccountTransactions(  int  customerID,  int  start,  int  pageSize, List dest ) {
    myErrors =  null ;
     boolean  hasNext = false;
     try  {
      dest.clear();
      Iterator results = getSession().iterate( "select uat.id from AccountTransaction uat where uat.customerId = ? order by uat.id desc",
                                                new  Integer( customerID ), Hibernate.INTEGER );
       int  count =  0 ; // счетчик записей
       while  ( results.hasNext() ) {
         if  ( count < start ) {
          results.next();
          count++;
           continue ;
        }
        dest.add( getSession().load( AccountTransaction. class , (  Long  ) results.next() ) );
        count++;
         if  ( pageSize >  0  && count >= start + pageSize ) {
           if  ( results.hasNext() ) {
            hasNext = true;
          }
           break ;
        }
      }
    }  catch  ( Throwable t ) {
      putError( t, "getAccountTransactions" );
      hasNext = false;
    }  finally  {
      getSession().clear();
    }
     return  hasNext ;
  }

Здесь int start - начальная позиция в списке, int pageSize - размер страницы, List dest - буфер выбранных записей (класса AccountTransaction). Сначала делаем выборку идентификаторов (значений первичного ключа), потом достаем нужные записи. Возвращаемое значение - hasNext - тоже немаловажно. Если оно true, занчит, есть еще записи, и в форме, показывающей список, можно показать кнопочку "Следующие".
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33374431
galisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое !

То что List можно заполнить отдельно (не затрагивая Hibernate SQL) и затем захлопнуть сессию - это я как то не додумался.

Спасибо, что просветили насчет утечек.
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33374933
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще я для постраничного просмотра пользуюсь Query
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     public  List loadPortion(Session session, String className, String condition, List params,  int  beginIndex,  int  size)  throws  HibernateException {
        Query query =  session.createQuery("from " + className + " "+ condition);
         for (  int  i =  0 ; i < params.size(); i++) {
            query.setParameter(i, params.get(i));
        }
        query.setFirstResult(beginIndex);
        query.setMaxResults(size);
         return  query.list();
    }
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375191
Zelen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
galisha
Если lazy loading , то придется сначала селектом узнать, сколько страниц получится в выборке. Может лучше все сразу засосать, и гонять List туда-сюда. Память то не сильно уйдет с учетом кол-ва одновременных запросов.

Если лист вырисуется больше 10,000 записей, на 1Гб памяти и JBoss'е падает в out of memory, хоть ты iterate'ом делай с flush'ем, хоть еще как.
Paging однозначно, без вариантов. Более того. Как ты представляешь себе огромный лист туда сюда гонять? Пока маленький проблем нет. А большой? Та ну нах.

galisha
С Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;)

Недавно проект смигрейтил с 2.1.8 за 3-ий. Никаких проблем. Во втором больше мелочей ненужных, которых в 3-ем нет. Нафиг изначально заморачиваться со старьем?
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375197
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0вообще я для постраничного просмотра пользуюсь Query



Да, это проще. В коде. В исполнении код будет извлекать записи, пока не достигнет beginIndex. Заметьте, ПОЛНЫЕ ЗАПИСИ. Это не так дешево, как кажется. В моем случае до start и затем от start до start + pageSize - 1 извлекаются только ID (1 поле).

Представьте, что у вас 10000 записей, и вам надо достать с 5000-й по 5049-ю. У вас впустую зачитаются 4999 ПОЛНЫХ записей, затем с пользой дела зачитаются 50. В моем случае зачитаются 4999 "бесполезных" ID, затем 50 "полезных" и 50 записей. Большая разница. То есть проще не значит лучше.

Кроме того, писать
Код: plaintext
"from " + className + " "+ condition
просто, но некачественно. Следует писать
Код: plaintext
  new  StringBuffer( "from " ).append( className ).append( " " ).append( condition ).toString()
Понятно, почему?...
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375204
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZelenНедавно проект смигрейтил

Правильнее сказать "смайгрейтил" (migrate произносится как "майгрэйт"). Можно еще "мигранул" (от русского "мигрировать").
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375275
vas0p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов
Кроме того, писать
Код: plaintext
"from " + className + " "+ condition
просто, но некачественно. Следует писать
Код: plaintext
  new  StringBuffer( "from " ).append( className ).append( " " ).append( condition ).toString()
Понятно, почему?...нет
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375288
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375444
коты
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galishaС Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;)

обязательно используйте hibernate annotations - это избавляет от трудоемких ревизий xml-маппингов при любом изменении модели данных.

если работаете в eclipse, то используйте свежую JBoss IDE (aka Hibernate Tools), там достаточно удобные средства реверса из rdbms в маппинг.
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375602
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
котыобязательно используйте hibernate annotations - это избавляет от трудоемких ревизий xml-маппингов при любом изменении модели данных.

Да-да, обязательно!... А еще лучше используйте XDoclet - тогда XML mappings будут генериться вообще автоматически...
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375638
vas0p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов 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
я пошутил.
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375721
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М.Голованов
Кроме того, писать
Код: plaintext
"from " + className + " "+ condition
просто, но некачественно. Следует писать
Код: plaintext
  new  StringBuffer( "from " ).append( className ).append( " " ).append( condition ).toString()
Понятно, почему?...

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

что касается Query, я с hibernate еще не "ты", поэтому написал свой вариант, чтобы услышать что в нем плохого :).

vas0p не надо под меня косить :)
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33375747
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите как сделать пэйджинг используя Criteria API.
Трабл в том, что для того чтобы узнать сколько всего страниц нужно определить сколько всего записей возвратит поисковый запрос.

criteria.list().size?
criteria.list();


Пока реализовано так. Что будет когда посисковый запрос будет возвращать к примеру 100000 записей при использовании строки:criteria.list().size?
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33388507
Zelen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов ZelenНедавно проект смигрейтил

Правильнее сказать "смайгрейтил" (migrate произносится как "майгрэйт"). Можно еще "мигранул" (от русского "мигрировать").

:-)
Считайте что это микс русского и нерусского.
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33388510
Zelen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов vas0вообще я для постраничного просмотра пользуюсь Query



Да, это проще. В коде. В исполнении код будет извлекать записи, пока не достигнет beginIndex. Заметьте, ПОЛНЫЕ ЗАПИСИ. Это не так дешево, как кажется. В моем случае до start и затем от start до start + pageSize - 1 извлекаются только ID (1 поле).

Вот здесь можно поподробнее?
Почему Вы думаете что он будет извлекать "пустые" (всмысле "ненужные") записи вообще? Если мне не изменяет память, то как минимум в Hibernate3, указанные команды (выше vas0 вроде) -- в SQL превратятся в нечто "limit X, Y", где X - сколько тянуть, а Y - offset. Что ни при каком раскладе не сделает чтобы база вытягивала "ненужные" записи.

Действительно интересно.
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33388648
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
	 public   boolean  supportsLimit() {
		 return  true;
	}
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33388836
klopua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов

Кроме того, писать
Код: plaintext
"from " + className + " "+ condition
просто, но некачественно. Следует писать
Код: plaintext
  new  StringBuffer( "from " ).append( className ).append( " " ).append( condition ).toString()
Понятно, почему?...

разве первое при компиляции во второе не превращается?

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()
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33388912
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 при склеивании строк всегда. Разница в нотации (количестве нажатий кнопок клавиатуры) невелика, зато не надо думать, что вот в этом случае сойдет, а вот в этом надо бы так...
...
Рейтинг: 0 / 0
Hibernate 2.1.8 Большие WEB выборки, как работает ?
    #33393711
Zelen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
М.Голованов
Мой код не зависит от того, поддерживает ли СУБД LIMIT или нет. В случае же конкретно MySQL, Oracle, MS SQL следует использовать setFirstResult / setMaxResults. Для этих (и практически всех остальных СУБД за редким исключением) соответствующий Hibernate Dialect имеет


А стоит ли так извращать код (делать его более трудночитаемым как в Вашем случае), расчитывая на откровенно weak базы данных? :-) Хотя конечно это зависит от назначений application, но все таки если так ориентироваться на базы, то лучше не Hibernate использовать, а прямо JDBC :-)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate 2.1.8 Большие WEB выборки, как работает ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]