カスタムのElasticSearch実装を使用して、定期的にライブのレガシーデータベースからすべてのドメインインスタンスのインデックスを再作成する必要があります。Grailsのバッチ読み取りの最適化
私が今までに見つけたすべての提案は、すべて最適化バッチ向けでした。の操作を書きました。
多くのテーブルには何百万ものレコードがありますが、domain.list().each { ... }
という単純な解決策では、データセット全体を一度にメモリにロードするように見えます。
Hibernateを使用すると、ScrollableResultsは良い解決策のようですが、RecordSetレベルで動作し、実際のドメインオブジェクトを再作成しません。私はid
フィールドをread()
に使用することができますが、それは非効率的です。
Searchableプラグインは、効率的なreindex
操作を実行しているようです。
ドメインインスタンスを一括して読み取るためのその他のオプションや最適化はありますか?
UPDATE
私は最近ScrollableResultSetに対するを使用すると、非効率的だろう示唆@BurtBeckwithからanswerとGrailsのメーリングリスト上の4歳のスレッドに出くわし。標準的なGORMメソッドを使用してレコードをページングし、バッチでセッションをクリアすることをお勧めします。
私はあなたがすべてのインスタンスIDのScrollableResultsクエリで正しい考えを持っていると思って、それらを個別に読み込んでいます。唯一の問題は、複合主キーを持つ従来のテーブルです。 – jamesallman
DBの実装に応じて、オフセットを使用すると、繰り返し同じデータを選択しているため、膨大なオーバーヘッドが発生する可能性があります。これは単純なクエリではおそらく問題ではありませんが、より複雑なクエリには時間がかかります。 – Joseph