假设我有一张包含数百万行的表格.使用JPA,对该表的查询进行迭代的正确方法是什么,这样我就没有包含数百万个对象的所有内存列表?
例如,我怀疑如果表很大,以下内容会爆炸:
List<Model> models = entityManager().createQuery("from Model m", Model.class).getResultList();
for (Model model : models)
{
System.out.println(model.getId());
}
Run Code Online (Sandbox Code Playgroud)
分页(循环和手动更新setFirstResult()/ setMaxResult())真的是最好的解决方案吗?
编辑:我定位的主要用例是一种批处理作业.如果运行需要很长时间,那就没关系了.没有涉及Web客户端; 我只需要为每一行"做一些事情",一次一个(或一些小N).我只是想避免让它们同时存在于内存中.
我正在使用MySQL,并希望利用该setFetchSize属性.默认的MySQL JDBC实现并不真正尊重它.如果设置FETCHSIZE到Integer.MIN_VALUE会分别读取每一行,但考虑到我想使用的原因FETCHSIZE是,我有足够的数据来把我的内存使用量成是要永远拿去做每行一个查询2 G范围.
我想插入一个可以与MySQL一起工作的JDBC实现并正确地考虑获取大小,允许我设置一个10,000或其他更高限制的fetchsize.任何人都可以指向一个可能提供这种实现的jar吗?失败那是否有任何其他资源允许我合理地以有效的方式执行包含数万个条目的查询,但是在内存和所需的sql查询数量方面.
我有一张包含数百万条记录的表格.为了使系统更快,我需要在我的Java代码中实现分页概念.我需要一次只获取1000条记录并处理它们,然后选择另外1000条记录并进行处理等等.我已经尝试了一些东西,但没有一个在起作用.我试过的一些事情如下 -
1) String query = "select * from TABLENAME" + " WHERE ROWNUM BETWEEN %d AND %d";
sql = String.format(query, firstrow, firstrow + rowcount);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,当查询是SELECT * from TABLENAME Where ROWNUM BETWEEN 0 and 10它给我一个结果但是当查询是SELECT * from TABLENAME Where ROWNUM BETWEEN 10 and 20,它返回一个空的结果集.我甚至试图在DB中运行它,它返回Empty结果集(不知道为什么!!)
2)preparedStatement.setFetchSize(100);我在我的Java代码中有这个,但它仍然从表中获取所有记录.无论如何,添加此语句并不会影响我的代码.
请帮忙!