java - 简单的 hibernate 查询返回非常慢

标签 java hibernate objectinstantiation

我有以下 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/

相关文章:

java - 如何让 Hibernate 将 CLOB 转换为 MySQL 类型

hibernate - 使用 Hibernate 进行国际化

c++ - 在类中声明对象时可能会导致此错误的原因是什么?

angularjs - 如何动态实例化服务?

java - 如何在打开 App Engine channel 时获取响应消息?

java - Spring 3..0.5 + hierbnate 3.6.6.final + jboss as 7 数据库访问

java - 条件生成器分组依据和计数不起作用

java - "Content-Disposition"和 AngularJS header 中的文件名

java - 我应该在哪里放置 XHTML 文件才能使其在 GlassFish Web 容器中可见?