java中的大型sql结果集

时间:2009-07-24 20:23:18

标签: java sql performance oracle jdbc

如何在java中获取大型结果集?我有大约140,000行,有3列。

5 个答案:

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

我建议使用批处理样式提取而不是加载所有内容。在执行具有大结果集的查询时,数据库端存在性能注意事项。