mysql - 通过导致内存不足错误的列表在 Wicket 口表中加载数百万个数据库行

标签 mysql query-optimization wicket large-data-volumes large-data

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

这是我通过查询加载列表的方式

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

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

**

数据库查询返回所有行的大列表

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

最佳答案

query.list() 的问题在于它一次返回所有 行。
除了 query.list(),您还可以使用:

这两个选项一次返回一行,这正是您所需要的。

请注意,查询在处理期间保持“执行”状态,因此您可能会发现表已锁定等,具体取决于您选择的隔离级别。

关于mysql - 通过导致内存不足错误的列表在 Wicket 口表中加载数百万个数据库行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250794/

相关文章:

mysql - 克服 LEFT JOIN 中的 "at least once"条件

java - Wicket、GMap3、Overlay Click事件,用户点击了哪里?坐标 (GLatLng) 是什么?

java - 提高mysql插入速度

php - 使用 PHP (PDO) 在 HTML 图像标记中显示来自 mysql 数据库的图像 (blob)

sql - 查询优化不适合左外连接

MySQL查询优化从大表中获取8-10条记录

java - GlassFish v3 上的 Wicket 口

java - 启动 Web 应用程序时出现 IllegalStateException - Spring + Wicket

mysql - 在 Ubuntu 上安装 mysql gem 的困难

php - 将 latin1 转换为 UTF8