我目前在我的项目中设置了hibernate。它适用于大多数事情。但是今天我需要从表中返回几十万行查询。它是表中总行数的约2 / 3s。问题是查询需要大约7分钟。使用直接JDBC并执行我假设的相同查询,它需要< 20秒因此,我认为我做的事情完全错了。我将在下面列出一些代码。
DetachedCriteria criteria =DetachedCriteria.forlass(MyObject.class);
criteria.add(Restrictions.eq("booleanFlag", false));
List<MyObject> list = getHibernateTemplate().findByCriteria(criteria);
关于它为什么会变慢和/或我可以做些什么来改变它的想法?
答案 0 :(得分:5)
您可能已经回答了自己的问题,直接使用JDBC。
Hibernate最多为每一行创建一些Object
的实例,或者更糟的是,为每行创建多个Object
个实例。 Hibernate有一些非常简并的代码生成和实例化行为很难控制,特别是对于大型数据集,如果你启用了任何缓存选项,那就更糟了。
Hibernate不适合大型结果集,并且处理数十万行作为对象也不是非常注重性能。
原始JDBC只是行列的原始类型。数据量较少的订单。
答案 1 :(得分:5)
如果您需要提取数十万条记录,我不确定hibernate是否正确使用。查询执行时间可能低于20秒,但获取时间会很长并占用大量内存。获得所有这些记录后,如何输出它们?它的数据远远超出您向用户显示的数据。对于进行数据仓库式数据处理而言,Hibernate并不是一个很好的解决方案。
答案 2 :(得分:1)
您可能在MyObject类和映射中有多个对其他类的引用,您可以设置预先加载或类似的东西。使用您编写的代码很难找到问题,因为它没问题 使用Hibernate Profiler - http://hibernateprofiler.com/可能会更好。它将向您显示映射,配置和查询的所有问题。