如何在java中获取大型结果集?我有大约140,000行,有3列。
答案 0 :(得分:8)
没有特殊方法可以检索大型结果集;这可以通过JDBC与任何其他数据库查询相同。
关键在于如何处理结果。 140,000个小记录不是太多,但如果将它们全部保存在应用程序内存中是一个问题,请考虑它们是否可以“流向”处理。也就是说,使用每条记录所需的信息,然后在检索下一条记录之前丢弃该记录。这样,内存要求不依赖于结果集中的记录数。
答案 1 :(得分:2)
(使用java.sql.Connection到您的数据库):
Statement st = cnxn.createStatement();
ResultSet rs = st.executeQuery("SELECT column1,column2,your_mom FROM some_table");
while(rs.next()){
Object ob1 = rs.getObject(1);
Object ob2 = rs.getObject(2);
Ho ob3 = rs.getHo(3);
doStuffWithRow(ob1,ob2,ob3);
}
除非您的DBMS在可怜的情况下无用,否则将根据请求从磁盘/内存中读取结果,并且不会在您的内存中或类似的任何内容中出现。使用基于原语的ResultSet.getXXX方法比getObject快,但我不想指定列类型。
请耐心等待,让我们突然说。哦,在这里远离ORM。
答案 2 :(得分:2)
如果您正在使用PostgreSQL,则需要按如下方式设置Connection和Statement:
Connection cnxn = ...;
cnxn.setAutoCommit(false);
Statement stmnt = cnxn.createStatement();
stmnt.setFetchSize(1);
否则您的查询可能会尝试&将一切加载到内存中。 感谢http://abhirama.wordpress.com/2009/01/07/postgresql-jdbc-and-large-result-sets/记录了这一点。
答案 3 :(得分:1)
我会避免使用任何类型的复杂抽象加载这样的数据集。这听起来像是一个“批处理作业”风格的应用程序。
我建议使用原始的jdbc并将其映射到一个非常紧凑的表示,没有膨胀只有3个colums这应该相当容易保存在内存中,如果字符串?并不过分。
避免使用hibernate等工具加载140k行。它是一个很棒的工具,但是如果你在休眠的第一级和第二级缓存中拥有那么多实体,你可能会遇到内存问题。
答案 4 :(得分:1)
我建议使用批处理样式提取而不是加载所有内容。在执行具有大结果集的查询时,数据库端存在性能注意事项。