次のHibernateクエリがあります。
Query query = session.createQuery("from MyHibernateClass");
List<MyHibernateClass> result = query.list();// executes in 7000ms
MySQLで実行されているSQLをログに記録すると、
select
myhibernat0_.myFirstColumn as myfirstcolumn92_,
myhibernat0_.mySecondColumn as mysecondcolumn92_,
myhibernat0_.mythirdcolumn as mythirdcolumn92_,
myhibernat0_.myFourthColumn as myfourthcolumn92_
from MyHibernateClass myhibernat0_
where (1=1);
MyHibernateClassデータベーステーブルの3500行の小さなデータセットでjvmのJavaコードを測定する場合、これには約7000ミリ秒かかります。
一方、Iが次のように直接jdbcを使用する場合:
Statement statement = session.connection().createStatement();
ResultSet rs = statement.executeQuery("select * from MyHibernateClass");// 7ms
List<MyHibernateClass> result = convert(rs);// executes in 20ms
同じSQLがデータベースに入力されているのがわかりますが、jvmのJavaコードで費やされる時間は7ミリ秒です。
MyHibernateClassは、ゲッターとセッターを備えた単純なJava Beanクラスであり、例に示されているような特別なresulttransformerは使用しません。クラスの読み取り専用インスタンスのみが必要であり、休止状態のセッションにアタッチする必要はありません。
Hibernateバージョンを使用したいのですが、実行時間を受け入れることができません。
追加情報:休止状態のログを追加した後、
[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は何をしていますか?どうすればわかりますか?