Java持久性内存泄漏 [英] java persistence memory leaks

查看:77
本文介绍了Java持久性内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个表中有1M行,我想获取所有这些行.但是,当我尝试通过分页获取jpa的所有行时,出现Java堆错误.你以为我错过了什么吗?任何建议

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();
}

解决方案

由于您始终使用本机SQL,您是否不能直接在SQL语句中指定LIMIT :counter, 1000(如果使用Oracle,则为ROWNUM BETWEEN :counter AND 1000)?

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?

这篇关于Java持久性内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆