Простой запрос гибернации возвращается очень медленно

У меня есть следующий запрос гибернации:

Query query = session.createQuery("from MyHibernateClass");
List<MyHibernateClass> result = query.list();// executes in 7000ms

При регистрации sql, выполняемого в MySQL, я вижу

select 
  myhibernat0_.myFirstColumn as myfirstcolumn92_, 
  myhibernat0_.mySecondColumn as mysecondcolumn92_, 
  myhibernat0_.mythirdcolumn as mythirdcolumn92_, 
  myhibernat0_.myFourthColumn as myfourthcolumn92_ 
from MyHibernateClass myhibernat0_ 
where (1=1);

При измерении кода java в jvm на небольшом наборе данных из 3500 строк в таблице базы данных MyHibernateClass это занимает около 7000 мс.

Если я, с другой стороны, использую прямой jdbc следующим образом:

Statement statement = session.connection().createStatement();
ResultSet rs = statement.executeQuery("select * from MyHibernateClass");// 7ms
List<MyHibernateClass> result = convert(rs);// executes in 20ms

Я вижу, что тот же sql входит в база данных, но теперь время, затрачиваемое на java-код в jvm, составляет 7 мс.

MyHibernateClass - это простой класс Java-компонента с геттерами и сеттерами,Я не использую специальных преобразователей результатов, как это видно на примере. Мне нужен только экземпляр класса, доступный только для чтения, и его не нужно подключать к сеансу гибернации.

Я бы предпочел использовать версию гибернации, но не могу принять время выполнения.

Добавлена ​​информация : После добавления журнала гибернации я вижу

[2011-07-07 14:26:26,643]DEBUG [main] [logid: ] - 
  org.hibernate.jdbc.AbstractBatcher.logOpenResults(AbstractBatcher.java:426) - 
  about to open ResultSet (open ResultSets: 0, globally: 0)

, за которым следуют 3500 из следующих операторов журнала

[2011-07-07 14:26:26,649]DEBUG [main] [logid: ] - 
  org.hibernate.loader.Loader.getRow(Loader.java:1197) - 
  result row: EntityKey[com.mycom.MyHibernateClass#1]

, за которыми следуют 3500 операторов журнала, например

[2011-07-07 14:27:06,789]DEBUG [main] [logid: ] - 
  org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:130) - 
  resolving associations for [com.mycom.MyHibernateClass#1]
[2011-07-07 14:27:06,792]DEBUG [main] [logid: ] - 
  org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:226) - 
  done materializing entity [com.mycom.MyHibernateClass#1]

Что это означает?

Что делает Hibernate в первой реализации, как я могу найти вне?

26
задан abhi 12 July 2016 в 17:34
поделиться