基于包的连续块获取

对于从远程站点检索大量数据的查询,基于包的连续块获取可以显著缩短应用程序的运行时间,并降低请求方和服务器处理器的成本。

对于具有以下特征的应用程序,基于包的连续块获取可提供性能优势:

  • 访问远程站点的应用程序中的查询是只读查询。
  • 该程序包不包含远程INSERT、UPDATE、DELETE或MERGE语句。

基于包的连续块获取优于基于SQL的连续块获取,因为:

  • 基于包的连续块获取可以逐个应用程序启用。
  • 基于包的连续块获取更容易实现。 您无需设置子系统参数,这些参数用于控制预期和允许的最大查询块数。 如果应用程序中的远程 SQL 语句都是只读查询,则无需更新应用程序。 启用基于包的连续块获取的应用程序或存储过程,只需在请求方和服务器上使用DBPROTOCOL(DRDACBF)选项将包绑定即可。

如果同时启用基于 SQL 的连续块获取,则启用基于包的连续块获取的应用程序将仅使用基于包的连续块获取。

启用基于包的连续块获取并启动远程 SQL 语句时,请求方和服务器将执行以下操作:

  1. 请求者检查 SQL 语句的类型以及 SQL 语句所针对的服务器。
    • 如果SQL语句是动态的UPDATE、INSERT、DELETE或MERGE语句,请求者将返回SQL错误。
    • 如果 SQL 语句不是动态 UPDATE、INSERT、DELETE 或 MERGE 语句,且 SQL 语句所针对的服务器不是 Db2 for z/OS® 第 11 版或更高版本(例如, Db2 for z/OS 第 10 版或更早版本,或 Db2 for Linux®, UNIX, and Windows ),则该语句的处理方式与未设置基于包的连续块获取时相同。
    • 如果SQL语句不是动态UPDATE、INSERT、DELETE或MERGE语句,且SQL语句所针对的服务器是 Db2 for z/OS 版本11或更高版本,则继续执行下一步。
  2. 请求者会为每个语句打开一个单独的连接。
  3. 请求者通过连接发送SQL语句,并向服务器表明该语句已启用基于包的连续块获取功能。
  4. 服务器接受每个连接,为每个连接关联一个线程,并独立于应用程序处理SQL语句。
  5. 如果语句是SQL CALL语句或查询,服务器将处理该语句,直到所有数据返回给请求者。 它继续生成查询块并将其发送到网络上,无需进一步提示,直到没有更多数据可返回。
  6. 在服务器上执行SQL语句时,如果该语句导致创建恢复单元(即该语句执行某种类型的更新操作),服务器将返回SQL错误。
  7. 请求者收到一个查询块。 当请求方处理完查询块中的所有内容后,应用程序会从网络接收下一个查询块,而无需向服务器发出请求。
  8. 当所有数据都返回给请求者后,连接即被关闭。 如果子系统参数 CMTSTAT 设置为 INACTIVE,则线程立即被池化。 否则,线程将被释放。 应用程序无需发出“释放连接”语句来关闭连接,也无需发出“提交”或“回滚”语句来允许线程池。

如果应用程序连接到远程服务器,然后从第二个服务器请求数据,则过程与此类似。 第一个服务器向第二个服务器表明请求者可以处理基于包的连续块获取。 第二个服务器使用基于数据包的连续块获取将数据返回给第一个服务器,而第一个服务器使用基于数据包的连续块获取将数据转发给请求者。

如果应用程序调用外部存储过程,该过程已启用基于包的连续块获取并返回结果集,则存储过程将结果集数据返回给请求者,而不使用基于包的连续块获取。 但是,如果存储过程打开游标仅向自身返回数据,则使用基于包的连续块获取来返回数据。