java持久性内存泄漏
我在一张桌子上有1百万行,我想得到所有的行。但当我试图通过分页获得jpa的所有行时,我得到了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
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增加堆大小最大值?请看:我已经尝试按照您的建议实现,但仍然没有释放内存。