java选择大表并导出到文件

时间:2015-07-17 22:44:14

标签: java sql hibernate jdbc

我有一个包含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

2 个答案:

答案 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();