Hibernate を使用して MySQL データベースのテーブルの各行を読み取り、それに基づいてファイルを書き込むだけです。しかし、9,000 万行あり、かなり大きいです。したがって、次のものが適切であると思われました。
ScrollableResults results = session.createQuery("SELECT person FROM Person person")
.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
storeInFile(results.get()[0]);
問題は、上記が while ループに移る前に 9000 万行すべてを RAM にロードしようとすることです...そして、 OutOfMemoryError: Java heap space exceptions :(.
ScrollableResults は私が探していたものではないと思いますか? これを処理する適切な方法は何ですか?この while ループに何日もかかったとしても、私は気にしません (そうならないようにしたいのですが)。
これを処理する他の唯一の方法は、setFirstResult と setMaxResults を使用して結果を反復処理し、ScrollableResults の代わりに通常の Hibernate の結果を使用することだと思います。それは効率が悪いように感じますが、8900万行で setFirstResult を呼び出すと、途方もなく長い時間がかかり始めます...
更新: setFirstResult/setMaxResults は機能しません。私が恐れていたように、オフセットに到達するのに非常に長い時間がかかることが判明しました。ここに解決策があるはずです!これはかなり標準的な手順ではありませんか?? 私は、Hibernate をやめて、JDBC など必要なものは何でも使用したいと思っています。
更新 2: 私が思いついた解決策は、基本的には次の形式です。
select * from person where id > <offset> and <other_conditions> limit 1
私は他の条件を持っているので、すべてがインデックスにあるとしても、まだ私が望むほど速くはありません...他の提案のためにまだ開いています..