我有以下 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 毫秒。
另一方面,如果我使用如下直接 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 代码花费的时间是 7ms。
MyHibernateClass 是一个带有 getter 和 setter 的简单 java bean 类,我没有使用特殊的 resulttransformer,如示例中所示。我只需要该类的只读实例,不需要附加到 hibernate session 。
我宁愿使用 hibernate 版本但不能接受执行时间。
添加信息: 添加 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 在第一个实现中做了什么,我怎样才能知道?
最佳答案
添加一个具有类的所有属性的构造函数就可以了,现在 hibernate 查询的执行时间是 70 毫秒。以前该类只有一个没有参数的默认构造函数和一个带有实体 id 参数的构造函数。
关于java - 简单的 hibernate 查询返回非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609645/