当前位置: 首页 > 知识库问答 >
问题:

JDBC 结果集获取大型数据集的内部机制

轩辕庆
2023-03-14

JDBC结果集是否在一次SQL查询的网络调用中提取所有数据?考虑查询< code > select * from table where timestamp

共有1个答案

田鸿彩
2023-03-14

获取行和批处理的确切行为因数据库系统和驱动程序而异。有些人将始终批处理,有些人将(默认情况下)一次获取所有行,对于有些人,它取决于结果集类型或其他因素。

默认情况下,MySQL连接器/J驱动程序将在执行时获取内存中的所有行。这可以更改为使用批处理大小的行流或基于游标的获取,如结果集下的JDBC API实现说明中所述:

默认情况下,结果集被完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计,更易于实现。如果您使用的结果集具有大量行或大值,并且无法在JVM中为所需内存分配堆空间,则可以告诉驱动程序一次将结果流回到一行。

若要启用此功能,请按以下方式创建一个< code >语句实例:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 

只进只读结果集的组合,提取大小为< code >整数。MIN_VALUE向驱动程序发出信号,使结果集逐行流动。此后,将逐行检索用该语句创建的任何结果集。

[……但请务必阅读警告说明。]

另一种方法是使用基于游标的流式处理每次检索设定数量的行。这可以通过将连接属性 useCursorFetch 设置为 true,然后调用 setFetchSize(int),其中 int 是每次要读取的所需行数来完成:

conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t");
stmt = conn.createStatement();
stmt.setFetchSize(100);
rs = stmt.executeQuery("SELECT * FROM your_table_here");
 类似资料:
  • 主要内容:ResultSet类型,ResultSet的并发性,浏览结果集,查看结果集,更新结果集SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 语句用于从数据库中选择行并在结果集中查看它们的标准方法。 接口表示数据库查询的结果集。 对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在对象中的行和列数据。 接口的方法可以分为三类: 浏览方法:用于移动光标。 获取方法:用于查看光标指向的当前行的列中的数据。 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数

  • 问题内容: 我正在使用CsvJdbc(它是用于csv文件的JDBC驱动程序)来访问csv文件。我不知道csv文件包含多少列。如何获得列数?是否有任何JDBC函数?我在java.sql.ResultSet中找不到任何方法。 为了访问该文件,我使用类似于CsvJdbc网站上示例的代码。 问题答案: 您可以从ResultSetMetaData获取列号:

  • 在这个oracle java教程中,它说: TYPE_FORWARD_ONLY:结果集不能滚动;其光标仅向前移动,从第一行之前移动到最后一行之后。结果集中包含的行取决于基础数据库如何生成结果。也就是说,它包含在执行查询时或在检索行时满足查询的行。 “结果集中包含的行取决于基础数据库生成结果的方式。 查询执行时间和行检索时间有什么区别?我如何知道我的数据库支持哪些?提前致谢。

  • 问题内容: 我们正在尝试优化我们的数据服务器应用程序。它通过mysql数据库存储股票和报价。而且我们对获取性能不满意。 语境 测试与结果 协议 通过在mysql命令行bin中运行生成的sql查询,可以获得mysql服务器上的执行时间。 服务器处于测试环境中:没有其他数据库读数,没有数据库书写 我们获取AAPL股票的857报价 案例1:与关联hibernate 这用857个报价对象填充了我们的库存对

  • JDBC是否有专门从Hive查询放入ResultSet的最大行数?我说的不是获取大小或分页,而是ResultSet中返回的总行数。 如果我错了,请更正,但获取大小设置了jdbc在数据库中每次传递时要处理的行数,并将适当的响应插入到结果集中。当它遍历了表中的所有记录后,它将结果集返回给Java代码。我问返回到Java代码的行数是否有限制。 如果它没有最大行数,则该类是否有任何固有的内容可能导致某些记

  • 问题内容: 当使用各种JDBC模板方法之一时,我对如何迭代/滚动大结果集(不适合内存)感到困惑。即使没有直接公开Iterable接口,我至少也希望RowQuerybackHandler实例在查询执行后( 而 不是在堆溢出之后)执行时被调用。 我也有在看一个这个(这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在spring论坛。后者似乎暗示在游标获取数据时确实应该调用回调处