开发者

java persistence memory leaks

开发者 https://www.devze.com 2023-02-26 00:40 出处:网络
I have 1M rows in a table and I want to get all of them. But when I try to get all rows with jpa by pagination then I get java heap error. Do you think that am I missing something? Any advice

I have 1M rows in a table and I want to get all of them. But when I try to get all rows with jpa by pagination then I get java heap error. Do you think that am I missing something? Any advice

int counter = 0;
while开发者_运维问答 (counter >= 0) {
   javax.persistence.EntityManager em = javax.persistence.Persistence
     .createEntityManagerFactory("MyPU")
     .createEntityManager();

   Query query = em.createQuery("select m from mytable m");
   java.util.Collection<MyEntity> data = query
          .setFirstResult(counter).setMaxResults(1000).getResultList();
   for(MyEntity yobj : data){
            System.out.println(obj);
   }
   counter += 1000;
   data.clear();
   em.clear();
   em.close();
}


Since you use native SQL anyway, can't you specify the LIMIT :counter, 1000 (or ROWNUM BETWEEN :counter AND 1000 if using Oracle) directly in your SQL statement?


Note that you create new instance of EntityManagerFactory at each iteration, but don't close it. Perhaps it would be better to use a single factory instead:

int counter = 0;
EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("MyPU");      
while (counter >= 0) {
    javax.persistence.EntityManager em = emf.createEntityManager(); 
    ...
}
0

精彩评论

暂无评论...
验证码 换一张
取 消