【问题标题】:How to fetch limited data from mysql java如何从mysql java中获取有限的数据
【发布时间】:2013-09-25 23:03:47
【问题描述】:

我可以限制结果集中的行数吗? 我的表包含大约 800000 行,如果我在结果集中获取它们,这肯定会导致 OOM 异常。每行有 40 列。 我不想同时处理它们,但每行都要过滤掉一些数据。

提前谢谢你。

【问题讨论】:

  • 你能显示你的sql查询吗?
  • 您可以添加诸如 top 1000(或)限制 0、1000 之类的内容。限制在 mysql 工作台中肯定有效,在 java 代码中不知道。
  • 能否提供java代码? java db 驱动程序不太可能加载所有行直到内存,并且只会在需要时加载行。
  • @Suresh atta: PreparedStatement ps = con.prepareStatement("select * from table");结果集 rs = ps.executeQuery(); if(rs.next()){ System.out.println(rs.first());我得到内存不足的错误。我就知道。 :-/

标签: java mysql resultset large-data


【解决方案1】:

您有几个选择。首先,为 SQL 查询添加限制。其次,您可以使用JDBCTemplate.query()RowCallbackHandler 一次处理一行。该模板将处理大型结果集的内存问题。

【讨论】:

  • 您能否指定它如何管理内存问题。我认为您的回答具有误导性
  • 一次加载有限数量的结果。我不知道 alg 的确切数量,但它会分批抓取结果,一次一个地传递给处理程序。
  • Spring Jdbc 模板是标准 JDBC API 的包装器。它使用相同的 jdbc 方法来设置 fetch 大小,请参阅,docs.spring.io/spring/docs/2.0.x/api/org/springframework/jdbc/…
【解决方案2】:

你可以在sql查询中使用limit关键字,见下文

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

您可以阅读有关使用limit here 的更多信息

干杯!!

【讨论】:

  • 结果集 rs = null; PreparedStatement ps = con.prepareStatement("select * from table"); ps.setFetchSize(100); rs = ps.executeQuery("从表中选择 *"); if(rs.next()){ System.out.println(rs.first()); } 这没有按预期工作。
  • ps.setMaxRows(20);这行得通。它一次只获取 20 行
【解决方案3】:

您可以使用JDBC fetch size 来限制结果集中的结果。它比 SQL LIMIT 更好,因为它也适用于其他数据库而无需更改查询。 Jdbc 驱动程序不会从数据库中读取整个结果。每次它都会检索由 fetch size 指定的记录,并且不会再有内存问题。

【讨论】:

    【解决方案4】:

    类似下面的方法应该是一个 SQL 解决方案,但虽然效率很低,因为每次您都必须获取越来越多的行。

    假设您的 ORDER BY 是基于 unique int 和 您将一次获取 1000 行。

    SET currenttop = 0;
    SET cuurentid = 0;
    SELECT * FROM YourTable t
    WHERE t1.ID > @currentID AND (@currentid := t1.ID) IS NOT NULL; 
    LIMIT (@currenttop:=@currenttop+1000);
    

    当然,您可以选择处理 Java 代码中的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2012-12-24
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      相关资源
      最近更新 更多