假设您有一个用Oracle Pro * C编写的UNIX进程,该进程查询需要很长时间的大量行。如果您手动或使用超时机制等终止进程,是否会停止在Oracle数据库中运行的查询,还是会继续运行使数据库实例保持忙碌状态?
配置:Oracle数据库10 / 11g,RedHat Enterprise Linux 4/5/6
干杯,
提恩
额外信息:我正在撰写可在客户系统上运行的3层架构软件。如果最终用户取消选择所有过滤器并获取日志数据,结果将是巨大的,并且所有无用的额外日志将花费很长时间。我在UI中添加了防止未经过滤的查询但我想正确修复它。
因此,我向客户端和服务器端流程基础架构添加了超时。我只是想确定当服务器端进程终止时,oracle不会忙于大查询。
答案 0 :(得分:1)
取决于。
当客户端进程向数据库发送请求时,数据库将继续处理该请求,直到它有响应。如果客户端进程在发送请求后死亡,则数据库无法知道这一点,直到它准备好发送响应为止。此时,它可以确定客户端进程已失败并放弃请求。如果您担心的性能问题是数据库需要很长时间才能运行查询以返回结果的第一行,则终止客户端进程将不会对此产生任何影响。
另一方面,如果您担心的性能问题是数据库运行查询以获取所有行需要很长时间,并且客户端应用程序需要很长时间才能获取所有行来自数据库的数据,查杀客户端将阻止查询运行。请记住,在幕后,过程始终是
如果大部分时间都花在迭代部分而不是等待数据库生成第一批结果,则终止客户端进程将阻止数据库花费更多时间生成更多批次。根据数据库设置(特别是,是否启用了死连接检测(DCD)),您可能仍希望终止数据库会话,因为它可能会在那里等待客户端进程请求下一批结果,但它赢了“在等待时积极消耗资源。