メモリリークを避けるために、テーブルの行数に基づいて動的バッチセレクタを作成しました。しかし、このコードスニペットは、の最後の数千の行をデータベースので検索できないようです。このHibernateページング機構で何が問題になっていますか?
本質的に、コードを以下に示す。明確にするため
System.out.println("Loading the query...");
Session session = HibernateUtil.getSessionFactory().openSession();
int i = 0;
int batch = 5000; //process in batches if table is too big
Long rowCount = (Long) session.createQuery("select count(*) " + cacheDetail.getQuery()).list().get(0);
System.out.println("Starting execution on " + cacheDetail.getQuery());
if (rowCount > batch) {
List<Object> list = session.createQuery(cacheDetail.getQuery())
.setFirstResult(i).setMaxResults(batch).list();
while(list.size() == batch || list.size() < batch){
i+=batch;
if (list.size() < batch) {
list = session.createQuery(cacheDetail.getQuery())
.setFirstResult(i).setMaxResults(list.size()).list();
} else {
list = session.createQuery(cacheDetail.getQuery())
.setFirstResult(i).setMaxResults(batch).list();
}
//Do some computation, close session
}
}
を、cacheDetail.getQuery()だけHQL SELECT文である: "TABLEX FROM"。
コード内のどこが間違っていますか?
'while(total.size()
ああ、大丈夫、あなたがポイントを持って、あなたは条件の間、あなたのロジックを持つことができますが、ポイントは合計するための新しいリストを作成し、それに各結果を追加する – developer
私は新しいリストを作成し、それに結果?私はむしろ記憶が非常に繊細であるので、そうではないだろう。編集:どのように私は比較のために私を使用して行くだろうか?これは、バッチをインクリメントするにつれてかなり見やすくなり、行ポインタとしてクエリに使用されています。 –