У меня есть следующий запрос на спящий режим:
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 bean с геттерами и сеттерами, я не использую никаких специальных трансформаторов результатов, как видно из примера. Мне нужен только экземпляр класса, доступный только для чтения, и его не нужно прикреплять к сеансу спящего режима.
Я бы предпочел использовать версию спящего режима, но не могу принять время выполнения.
Добавленная информация: После добавления записи в спящий режим я вижу
[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 в первой реализации, как я могу узнать?