2

假设您有一个用 Oracle Pro*C 编写的 UNIX 进程,它查询大量行需要很长时间。如果您手动终止进程或使用超时机制等,这会停止在 Oracle 数据库中运行的查询还是会继续运行以保持数据库实例繁忙?

配置:Oracle 数据库 10/11g、RedHat Enterprise Linux 4/5/6

干杯,

泰恩

额外信息:我正在编写在客户系统上运行的 3 层架构软件。如果最终用户取消选择所有过滤器并获取日志数据,结果将是巨大的,并且所有无用的额外日志都需要很长时间。我在 UI 中添加以防止未经过滤的查询,但我想正确修复它。

因此,我向客户端和服务器端进程基础架构添加了超时。我只是想确定当服务器端进程终止时,oracle 不会忙于大查询。

4

1 回答 1

1

这取决于。

当客户端进程向数据库发送请求时,数据库将继续处理该请求,直到得到响应。如果客户端进程在发送请求后死亡,数据库在准备好发送响应之前无法知道这一点。此时,它可以确定客户端进程失败并放弃请求。如果您担心的性能问题是数据库运行查询需要很长时间才能返回结果的第一行,那么杀死客户端进程对此没有任何影响。

另一方面,如果您担心的性能问题是数据库运行查询以获取所有行需要很长时间,而客户端应用程序需要很长时间才能从中获取所有数据数据库,杀死客户端将停止运行查询。请记住,在幕后,过程总是

  • 客户端发送请求
  • 数据库开始处理请求
  • 一旦数据库有第一批结果,它就会将它们发送给客户端
  • 客户端处理第一批结果并请求下一批
  • 数据库处理下一批结果,将下一批结果发送给客户端
  • 冲洗并重复,直到没有更多结果返回。

如果大部分时间都花在迭代部分而不是等待数据库产生第一批结果,那么终止客户端进程将阻止数据库花费更多时间生成更多批次。根据数据库设置(特别是是否启用了死连接检测 (DCD)),您可能仍希望终止数据库会话,因为它可能会坐在那里等待客户端进程请求下一批结果,但它不会等待时不要主动消耗资源。

于 2013-08-05T17:30:13.397 回答