我们已经从java 1.4迁移到数据库视图的直接sql查询到java 8,域对象和带有hibernate的orm持久性。
我的批处理过程必须从数据库中读取300,000行,如下所示:
HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
List<?> list = hibernateTemplate.find("from Widgets widgets where widget.status=?", status);
然而这非常慢(9分钟,相比数据库查询为30秒)并消耗大量内存。
我打开了休眠show_sql
,我可以看到它花了很多时间从3个不同的表加载域对象(Widget包含Wobjet和Wudget,让我们说)
由于我不需要整个list
(我可以逐行进行批量处理),我想知道:
在休眠中是否存在某种类型的ResultSet更高效(更快)?
顺便提一下,我们使用的是spring批处理,后备数据库是Oracle(虽然可以改变)。
如果可能的话,使用HibernateTemplate
更容易实现这一点,因为我们Dao
层中的所有其他操作都使用相同的模板(尽管这是批量处理的第一个操作数据量。)