我有一个包含62,000,000行aprox的表,需要从这些导出到.txt或.csv中选择数据
我的查询将结果限制为60,000行aprox。
当我在开发者机器中运行查询时,我会吃掉所有内存并获得java.lang.OutOfMemoryError
在这一刻我使用Hibernate for DAO,但是当你推荐时我可以改为纯JDBC解决方案
我的pseoudo代码是
List<Map> list = myDao.getMyData(Params param); //program crash here
initFile();
for(Map map : list){
util.append(map); //this transform row to file
}
closeFile();
建议我写我的文件?
注意:我使用.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
来获取Map
而不是Entity
答案 0 :(得分:0)
锁定表,然后执行子集选择和导出,附加到结果文件。确保您在完成后无条件解锁。 不太好,但即使在有限的资源服务器或客户端上,任务也将完成。
答案 1 :(得分:0)
你可以使用hibernate&#39; ScrollableResults
。请参阅此处的文档:http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch11.html#objectstate-querying-executing-scrolling
如果您的数据库引擎/数据库驱动程序支持此操作,则使用服务器端游标。请确保为此工作设置以下属性:
query.setReadOnly(true);
query.setCacheable(false);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
while (results.next()) {
SomeEntity entity = results.get()[0];
}
results.close();