DB から適切な結果をスクロールして、巨大なファイル レポートを作成する必要がある場合の典型的なタスクを考えてみましょう。ORM フレームワークはHibernate
. OutOfMemoryException
このようなパターンを回避する方法は 3 つあります。
使用
session.evict(...)
:ScrollableResults customers = session.createQuery("from Customers order by id").scroll(ScrollMode.FORWARD_ONLY); while (customers.next()) { Customer customer = (Customer) customers.get(0); addDataToReport(customer); session.evict(customer); }
使用
session.clear()
:ScrollableResults customers = session.createQuery("from Customers order by id").scroll(ScrollMode.FORWARD_ONLY); int i = 0; while (customers.next()) { Customer customer = (Customer) customers.get(0); addDataToReport(customer); if ( ++i % 1000 == 0) session.clear(); }
使用
CacheMode.IGNORE
:ScrollableResults customers = session.createQuery("from Customers order by id").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWARD_ONLY); while (customers.next()) { Customer customer = (Customer) customers.get(0); addDataToReport(customer); }
したがって、問題は次のとおりです。これらの方法のうち、前述の目的に対して (パフォーマンスの意味で) 最も優れているのはどれですか? それとも、もっと効果的な方法が他にあるのでしょうか?