0

我正在通过sortabledataprovider装载百万行数据 ..查询返回一个列表(Arraylist),因为我将它发送到启用Wicket ajax的表和分页启用表。 所以问题是 - 如果有并发查询 - 应用程序可能会崩溃。 我已经在数据库中获得100,000行的Java堆空间错误。 所以我想实现的是这个 - 当用户点击下一页或者可能是第10页时 - 它将只加载数据库中的第10页数据 - 而不是整个查询中可能有数百行的数据。通过引起错误内存错误的列表在数据库中载入数百万行数据

这里是我如何查询加载列表

 final SyslogProvider<SyslogParsed> sysLogProviderAjax = new SyslogProvider<SyslogParsed>(new ArrayList<SyslogParsed>()); 

    * 
    * 
      daoList = syslogParsedDao.findByDatesAndHostName(utcStartDate, utcEndDate, null); 
     sysLogProviderAjax.setList(daoList); 

**

DB查询返回的所有行

  public List<logParsed> findByDatesAndHostName() { 
    return getJpaTemplate().execute(new JpaCallback<List<SyslogParsed>>() { 

      return query.getResultList(); 
     } 
    }); 
} 

的大名单======= == 我的数据提供者

public class logProvider<logParsed> extends SortableDataProvider{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
@SpringBean(name="logParsedDao") 
private logParsedDao logParsedDao; 

class SortableDataProviderComparator implements Comparator<logParsed>, Serializable { 

    public int compare(logParsed log1, logParsed log2) { 
     PropertyModel<Comparable> model1 = new PropertyModel<Comparable>(log1, getSort().getProperty()); 
     PropertyModel<Comparable> model2 = new PropertyModel<Comparable>(log1, getSort().getProperty()); 

     int result = model1.getObject().compareTo(model2.getObject()); 

     if (!getSort().isAscending()) { 
      result = -result; 
     } 

     return result; 
    } 

} 


private List<logParsed> list = new ArrayList<logParsed>(); 
private SortableDataProviderComparator comparator = new SortableDataProviderComparator(); 

public logProvider(List<logParsed> sentModel){ 

    setSort("numberOfEntries",SortOrder.DESCENDING); 
    list = sentModel; 
} 

public Iterator<logParsed> iterator(int first, int count) { 

    //ArrayList<logParsed> newList = (ArrayList<logParsed>) logParsedDao.findAll(); 
    //Collections.sort(newList, comparator); 
    Iterator<logParsed> iterator = null; 

    try { 
     if(getSort() != null) { 
      Collections.sort(list, new Comparator<logParsed>() { 
       private static final long serialVersionUID = 1L; 

        public int compare(logParsed sl1, logParsed sl2) { 
        int result=1; 
         PropertyModel<Comparable> model1= new PropertyModel<Comparable>(sl1, getSort().getProperty()); 
         PropertyModel<Comparable> model2= new PropertyModel<Comparable>(sl2, getSort().getProperty()); 

         if(model1.getObject() == null && model2.getObject() == null) 
          result = 0; 
         else if(model1.getObject() == null) 
          result = 1; 
         else if(model2.getObject() == null) 
          result = -1; 
         else 
          result = model1.getObject().compareTo(model2.getObject()); 

         result = getSort().isAscending() ? result : -result; 

         return result; 
       } 
      }); 
     } 

     if (list.size() > (first+count)) 
      iterator = list.subList(first, first+count).iterator(); 
     else 
      iterator = list.iterator(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return iterator; 

} 

public int size() { 
    // TODO Auto-generated method stub 
    return list.size(); 
} 

public IModel<logParsed> model(final Object object) { 
    return new AbstractReadOnlyModel<logParsed>() { 
     @Override 
     public logParsed getObject() { 
      return (logParsed) object; 
     } 
    }; 
} 

public void setList(List<logParsed> newList){ 

    list = newList; 
    } 

}

回答

3

query.list()的问题是它一次返回全部行。
而不是query.list()您可以使用:

这两个选项返回一个一次一排,这是你需要的。

请注意,查询在处理期间保持“正在执行”状态,因此根据您选择的隔离级别,您可能会发现表格被锁定等。

+0

+1我不知道滚动/迭代。 – 2012-04-20 18:56:10

+0

我必须尝试 - 与其他东西忙碌将回到你这个 – 2012-04-24 16:38:01

2

您必须使用JPA查询来排序并且每次调用IDataProvideriterator(int first, int count)时只返回所需的行。

事情与此类似:

public Iterator<logParsed> iterator(int first, int count) { 

    Query query = entityManager.createQuery("from LogParsed m ORDER BY m.numberOfEntries DESC", LogParsed.class); 
    List<LogParsed> output = query.setFirstResult(first).setMaxResults(count).getResultList(); 

    return output.iterator(); 
} 

看一看this question

+0

谢谢 - 看起来很有帮助 - 让我先尝试 – 2012-04-24 16:38:24