当前位置: 首页 > 面试题库 >

一次以固定数量的结果流式传输MySql ResultSet

濮俭
2023-03-14
问题内容

我有包含1600万条记录的MySql表,由于某些迁移工作,我正在读取整个Mysql表。

以下代码用于在MySql中流式传输大型ResultSet

        statement = connection.createStatement(
                java.sql.ResultSet.TYPE_FORWARD_ONLY,
                java.sql.ResultSet.CONCUR_READ_ONLY);
        statement.setFetchSize(Integer.MIN_VALUE);

但这一次一次流式传输一个结果,这是否意味着我们在每一行都命中了MySql服务器

在使用流式传输时,我们可以设置以下语句吗?setFetchSize(1000);

我想减少流式传输大型ResultSet时往返服务器的次数


问题答案:

我将假定您使用的是MySQL提供的官方JDBC驱动程序Connector / J。

您显式地告诉JDBC(和MySQL)以逐行方式传输结果 statement.setFetchSize(Integer.MIN_VALUE);

从MYSQL文档:

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

要启用此功能,您需要按以下方式创建一个Statement实例

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

前向只读结果集与访存大小为Integer.MIN_VALUE的组合用作驱动程序发出信号以逐行流式传输结果集的信号。此后,将使用该语句创建的任何结果集逐行检索。

Integer.MIN_VALUEMySQL将忽略除获取大小以外的任何值,并应用标准行为。整个结果集将由JDBC驱动程序获取。

要么不使用setFetchSize(),否则JDBC驱动程序将使用默认值(0),或将其值0显式设置。使用值0还将确保JDBC不使用MySQL游标,这可能取决于您的MySQL和Connector
/ J版本和配置而发生。



 类似资料:
  • 我有一个包含1600万条记录的MySql表,由于一些迁移工作,我正在读取整个MySql表。 以下代码用于在MySql中流式传输大型结果集 但这是一次流式传输一个结果,这是否意味着我们每行都命中MySql服务器 在使用流时,我们可以设置如下语句:setFetchSize(1000); 我想减少到服务器的往返次数,同时流式传输大型 ResultSet

  • 问题内容: 使用MVC模型,我想编写一个JsonResult,它将Json字符串流式传输到客户端,而不是一次将所有数据转换成Json字符串,然后将其流回客户端。我有一些动作需要在Json传输时发送非常大的记录(超过300,000条记录),我认为基本的JsonResult实现是不可伸缩的。 我正在使用Json.net,我想知道是否有一种方法可以在转换Json字符串时流化它的块。 但是我不确定如何将这

  • 问题内容: 我正在开发一个使用大型MySQL表的spring应用程序。加载大表时,我得到一个,因为驱动程序试图将整个表加载到应用程序内存中。 我尝试使用 但是然后我打开的每个ResultSet都挂了; 在网上查看时,我发现发生这种情况是因为它尝试在关闭ResultSet之前尝试加载所有未读的行,但事实并非如此,因为我这样做是: 小表(3行)也会发生挂起,如果我不关闭RecordSet(在一种方法中

  • 我使用的是spring data mongodb,我想使用光标进行聚合操作。 MongoTemplate.stream()得到一个查询,所以我尝试创建聚合实例,使用ggregation.toDbObject()将其转换为DbObject,使用DbObject创建BasicQuery,然后调用stream()方法。 这返回一个空光标。 调试spring数据mongodb代码显示MongoTempla

  • 根据我的阅读,我认为使用MySQL JDBC驱动程序在MySQL中流式传输< code>ResultSet的方法是这两个命令: 我的问题是,专家能否澄清使用上述代码流式传输ResultSet是否会将一行返回给客户端,然后去服务器获取下一行,依此类推(效率非常低),或者它是否足够智能,可以像一样进行缓冲流式传输?如果它进行缓冲流式传输,如何设置缓冲区大小? 编辑:来自文档: 前向只读结果集与整数获取

  • 由于我刚接触DataFlow/Beam,概念还不太清楚(或者至少我在开始编写代码时有困难),我有很多问题: 什么是最好的模板或模式,我可以用来做到这一点?我应该先执行BigQuery的PTransform(然后执行PubSub的PTransform)还是先执行PubSub的PTransform? 我怎么做加入?比如? PubSub的最佳窗口设置是什么?BigQuery的PTransform部分的窗