我需要使用自定义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/