hibernate - Grails批量读取优化

标签 hibernate grails gorm

我需要使用自定义ElasticSearch实现定期从实时旧版数据库重新索引所有域实例。

到目前为止,我发现的所有建议都是为了优化批处理操作。

许多表都有成千上万个记录,即使不是上百万个记录,domain.list().each { ... }的简单解决方案似乎也可以一次将整个数据集加载到内存中。

使用Hibernate ScrollableResults似乎是一个很好的解决方案,但是它可以在RecordSet级别上运行,并且不会重新创建实际的域对象。我可以使用id字段 read() 实例,但这似乎效率很低。

Searchable插件似乎可以执行有效的reindex操作。

成功批读取域实例还有哪些其他选择或优化?

更新

我最近在Grails邮件列表上偶然发现了一个有4年历史的线程,上面有一个来自answer@BurtBeckwith,表明使用ScrollableResultSet效率不高。他建议使用标准GORM方法翻阅记录,并分批清除 session 。

最佳答案

1)使用传统的Java for循环将为您节省一些开销。

2)整理数据可能会有所帮助。您可以使用max:和offset:来获取100或1000的块,这样您就始终可以处理较小的集合:http://grails.org/doc/latest/ref/Domain%20Classes/list.html
但是,如果您要修改该表中的对象或在工作流中间添加新数据,则可能存在问题。 (我将其留给您测试:)

3)使用SQL或HSQL获取所有ID的持有权,然后使用Grails .load()可能也会有所帮助。 http://grails.org/doc/latest/ref/Domain%20Classes/load.html

4)我以前尝试使用Grails / Hibernate实施一些大批量作业,但发现它确实不能很好地工作。我建议您尽可能使用SQL直接使用数据库。到目前为止,它将是最快的。

关于hibernate - Grails批量读取优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793237/

相关文章:

jquery-ui - Grails 2.4 包含 jquery-ui

Grails 创建例程

hibernate - 如何像在grails中那样使我的h2数据库在micronaut中持久化?

grails - 的行为belongsTo

hibernate - 按多对多关系查询时从结果列表中排除项目

java - 没有合适的司机。尝试使用 Hibernate 连接到 Heroku 上的 postgresql 数据库

Spring:@Transactional with readonly=true 不调用 conn.setReadOnly(true)

grails - 基于WSDL的Groovy/Grails模拟Web服务

hibernate - JPA/Hibernate 异常处理

java - Hibernate:@ManyToMany 关系中对象集的传递持久性