Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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 获取500K+;使用Hibernate从Oracle数据库中删除行_Java_Oracle_Hibernate - Fatal编程技术网

Java 获取500K+;使用Hibernate从Oracle数据库中删除行

Java 获取500K+;使用Hibernate从Oracle数据库中删除行,java,oracle,hibernate,Java,Oracle,Hibernate,我正在从一个表中提取行,以便将行写入csv文件,但该表包含的行超过500000行,因此在提取数据时,它会抛出“堆出内存”异常。如何处理此问题?使用insteand ofquery.list()获取查询结果。这将避免将整个结果集加载到内存中。您可以尝试对查询分页,以批量获取和处理数据: // Would 1000 records per batch be optimal? final int pageSize = 1000; int pageNumber = 1; boolean done = f

我正在从一个表中提取行,以便将行写入csv文件,但该表包含的行超过500000行,因此在提取数据时,它会抛出“堆出内存”异常。如何处理此问题?

使用insteand of
query.list()
获取查询结果。这将避免将整个结果集加载到内存中。

您可以尝试对查询分页,以批量获取和处理数据:

// Would 1000 records per batch be optimal?
final int pageSize = 1000;
int pageNumber = 1;
boolean done = false;

Criteria criteria = session.createCriteria(MyEntity.class);
while (! done) {
    criteria.setFirstResult((pageNumber - 1) * pageSize);
    criteria.setMaxResults(pageSize);

    List<MyEntity> ents = (List<MyEntity>) criteria.list();
    if (ents != null) {
        for (MyEntity e : ents) {
            // Process the entity.
        }
        // Maybe check for ending like this?
        // done = ents.size() < pageSize;
        pageNumber++;
    }
    else {
        // No more data.
        done = true;
    }
}
//每批1000条记录是否最佳?
最终int pageSize=1000;
int pageNumber=1;
布尔完成=假;
条件=session.createCriteria(MyEntity.class);
而(!完成){
条件.setFirstResult((页码-1)*页面大小);
标准.setMaxResults(页面大小);
List ents=(List)criteria.List();
如果(ents!=null){
对于(我的实体e:ents){
//处理实体。
}
//也许检查一下这样的结局?
//done=ents.size()
更新

从2008年回来,但它讨论了你的问题。有人说速度慢是因为Oracle服务器。他们还讨论了
query.scroll()

您应该从Oracle检查和这两个:和

更新


刚找到这个。它不用于数据库处理,但将来可能会有用。

粘贴代码,以便我们知道您在做什么(以及如何做)?使用普通JDBC,我可以进行分页查询(即在MySQL上使用LIMIT子句,在Oracle上使用ROWNUM)因此,您应该在Hibernate中查找相应的工具,但我使用的是Hibernate.HcFilter HcFilter=new HcFilter(filterSettings,getEntityClass(),getIdField());list=getHibernateTemplate().executeFind(hcFilter);我已经给出了我在上面使用的代码。我正在使用下面给出的代码。这里如何使用。HcFilter HcFilter=新的HcFilter(filterSettings,getEntityClass(),getIdField());list=getHibernateTemplate().executeFind(hcFilter);HibernateTemplate在幕后调用
query.list()。使用
HibernateTemplate.execute(HibernateCallback)
,并在回调中使用
query.scroll()执行查询。出于好奇,这将允许我在使用JPA时使用生产者-消费者设计模式。我尝试了分页的概念,但是它慢了性能,因为它需要很长的时间。是的,我得到了解决方案,我不需要做任何事情,只是我在启动时增加了JVM内存。好的一个:-你应该考虑某种类型的。这类问题的流/批处理方法。在某些环境中,您可能无法/不允许增加内存。