データベースビューに対する直接SQLクエリを使用するJava 1.4から、Java 8、ドメインオブジェクト、および休止状態を使用したorm永続性に移行しました。
私のバッチ プロセスは、データベースから 300,000 行を読み取る必要があり、次のようになります。
HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
List<?> list = hibernateTemplate.find("from Widgets widgets where widget.status=?", status);
ただし、これは非常に遅く (データベース クエリの 30 秒に対して 9 分)、多くのメモリを消費します。
休止状態をオンにするshow_sql
と、3 つの異なるテーブルからドメイン オブジェクトをロードするのに多くの時間を費やしていることがわかります (ウィジェットには Wobjet と Wudget が含まれています)。
そして、私は全体を必要としないのでlist
(行ごとにバッチ処理を行うことができます)、私は疑問に思います:
よりメモリ効率の高い(そしてより速い)休止状態のある種のResultSetはありますか?
ちなみに、Spring Batch を使用しており、バッキング データベースは Oracle です (ただし、これは変更される可能性があります)。
HibernateTemplate
レイヤー内の他のすべての操作は同じテンプレートを使用するため、可能であれば、 でこれを操作する方が簡単ですDao
(ただし、これは大量のデータをバッチ処理する最初の操作です)。