我们已经从使用针对数据库视图的直接 sql 查询的 java 1.4 迁移到 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 个不同的表中加载域对象(比如说,小部件包含一个 Wobjet 和一个 Wudget)
而且由于我不需要整个list
(我可以逐行进行批处理),我想知道:
hibernate 中是否有某种 ResultSet 内存效率更高(更快)?
顺便说一句,我们使用的是 Spring Batch,而后备数据库是 Oracle(尽管可以更改)。
如果可能的话,使用 会更容易HibernateTemplate
,因为我们层中的所有其他操作都Dao
使用相同的模板(尽管这是批量处理大量数据的第一个操作)。