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

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

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

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

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

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

выживет :)

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

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

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

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

С Hibernate 3 что то у меня не срослось, сходу тяжко. Сложноватый он, после освоения двухи видимо попрет ;)
...
Рейтинг: 0 / 0
11.11.2005, 17:40
    #33374357
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
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
11.11.2005, 18:12
    #33374431
galisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
Спасибо большое !

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

Спасибо, что просветили насчет утечек.
...
Рейтинг: 0 / 0
12.11.2005, 12:19
    #33374933
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
вообще я для постраничного просмотра пользуюсь 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
12.11.2005, 23:34
    #33375191
Zelen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
galisha
Если lazy loading , то придется сначала селектом узнать, сколько страниц получится в выборке. Может лучше все сразу засосать, и гонять List туда-сюда. Память то не сильно уйдет с учетом кол-ва одновременных запросов.

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

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

Недавно проект смигрейтил с 2.1.8 за 3-ий. Никаких проблем. Во втором больше мелочей ненужных, которых в 3-ем нет. Нафиг изначально заморачиваться со старьем?
...
Рейтинг: 0 / 0
12.11.2005, 23:44
    #33375197
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
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
12.11.2005, 23:54
    #33375204
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
ZelenНедавно проект смигрейтил

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

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

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

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

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

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

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

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


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

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

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



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

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

Действительно интересно.
...
Рейтинг: 0 / 0
20.11.2005, 11:05
    #33388648
М.Голованов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
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
20.11.2005, 18:26
    #33388836
klopua
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate 2.1.8 Большие WEB выборки, как работает ?
М.Голованов

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


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


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