0

sortabledataproviderで数百万行のデータを読み込んでいます。Wicketajax対応テーブルとページ付け有効テーブルに送信すると、クエリはリスト(Arraylist)を返します。したがって、問題は、-同時クエリがある場合-アプリケーションがクラッシュする可能性があるということです。DBに100,000行しかないJavaヒープスペースエラーがすでに発生しています。 だから私が達成したいのはこれです-ユーザーが次のページをクリックするか、10ページ目になる可能性があります-DBから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;
    }

}

4

2 に答える 2

3

問題は、すべての行を一度query.list()に返すことです。 代わりに、次のいずれかを使用できます。
query.list()

これらのオプションは両方とも、一度に1行を返します。これは、必要なものです。

クエリは処理中は「実行中」のままであるため、選択した分離レベルによっては、テーブルがロックされているなどの場合があります。

于 2012-04-20T18:55:12.840 に答える
2

の行が呼び出されるたびに、必要な行のみをソートして返すJPAクエリを使用する必要がiterator(int first, int count)ありますIDataProvider

これに似たもの:

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

この質問を見てください。

于 2012-04-20T18:38:40.787 に答える