Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java持久性内存泄漏_Java_Jpa_Memory Leaks - Fatal编程技术网

java持久性内存泄漏

java持久性内存泄漏,java,jpa,memory-leaks,Java,Jpa,Memory Leaks,我在一张桌子上有1百万行,我想得到所有的行。但当我试图通过分页获得jpa的所有行时,我得到了java堆错误。你认为我遗漏了什么吗?有什么建议吗 int counter = 0; while (counter >= 0) { javax.persistence.EntityManager em = javax.persistence.Persistence .createEntityManagerFactory("MyPU") .createEntityManage

我在一张桌子上有1百万行,我想得到所有的行。但当我试图通过分页获得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();
}
int计数器=0;
而(计数器>=0){
javax.persistence.EntityManager em=javax.persistence.persistence
.createEntityManagerFactory(“MyPU”)
.createEntityManager();
Query Query=em.createQuery(“从mytable m中选择m”);
java.util.Collection data=query
.setFirstResult(计数器).setMaxResults(1000).getResultList();
对于(MyEntity yobj:数据){
系统输出打印项次(obj);
}
计数器+=1000;
data.clear();
em.clear();
em.close();
}

既然您仍然使用本机SQL,您能否直接在SQL语句中指定
限制:计数器,1000
(或者
行数介于:计数器和1000之间,如果使用Oracle)?

请注意,您在每次迭代中都会创建
EntityManagerFactory
的新实例,但不要关闭它。或许最好使用单一工厂:

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

我使用的是mysql,我们可以指定限制,但JPA不允许。JPA提供了一种通过set FIRSTRUSTL和set Max Result分页的机制,这两种机制工作得很好,但当计数器达到250000时,它抛出堆异常,一些JPA实现在“内存”中进行分页,而不是让数据库进行分页,这当然是无稽之谈。它是否与EntityManager.createNativeQuery()配合使用?
?唯一的方法是使用本机查询进行分页,以防止内存泄漏。多亏了ALL,它才起作用。您是否尝试过使用-Xmx增加堆大小最大值?请看:我已经尝试按照您的建议实现,但仍然没有释放内存。