【问题标题】:Python code to cancel a running Oracle SQL Query用于取消正在运行的 Oracle SQL 查询的 Python 代码
【发布时间】:2018-11-14 08:48:38
【问题描述】:

我有以下 python 代码,它在 Oracle 数据库中运行多个 SQL 查询并将它们组合到一个数据帧中。

查询存在于一个 txt 文件中,每一行都是一个单独的 SQL 查询。循环按顺序运行查询。我想取消运行超过 10 秒的任何 SQL 查询,以免在数据库中产生开销。 下面的代码实际上并没有给出我想要的结果。更具体地说,这段代码真的可以帮助我解决我的问题:

        if (time.time() - start) > 10: 
        connection.cancel()

完整的python代码如下。可能是一个oracle函数,可以调用取消查询。

import pandas as pd
import cx_Oracle
import time

ip = 'XX.XX.XX.XX'
port = XXXX
svc  = 'XXXXXX'
dsn_tns = cx_Oracle.makedsn(ip, port, service_name = svc)

connection = cx_Oracle.connect(user='XXXXXX'
                           , password='XXXXXX'
                           , dsn=dsn_tns
                           , encoding = "UTF-8"   
                           , nencoding = "UTF-8"  
                           )

filepath = 'C:/XXXXX'

appended_data = []

with open(filepath + 'sql_queries.txt') as fp:  
    line = fp.readline()
    while line:
        start = time.time()
        df = pd.read_sql(line, con=connection)
        if (time.time() - start) > 10: 
            connection.cancel()
            print("Cancel")         
        appended_data.append(df)
        df_combined = pd.concat(appended_data, axis=0)
        line = fp.readline()
        print(time.time() - start)
    fp.close()

【问题讨论】:

  • 据我所知,connection.cancel() 是唯一可行的选择
  • @HellHammer 我使用了 connection.cancel() 但查询首先发送到数据库,然后语句 connection.cancel() 运行。换句话说,无论如何查询总是运行。我希望代码捕获执行时间,然后终止查询
  • 您需要执行异步查询以使执行时间上的任何计时器工作。取消查询的客户端问题并不意味着数据库实际上会取消 - 您必须专门杀死数据库中的 spid。

标签: python sql oracle kill cancellation


【解决方案1】:

更好的方法是花一些时间调整查询,使其尽可能高效。正如@Andrew 指出的那样,我们不能轻易地从数据库外部终止数据库查询 - 甚至不能从数据库内部的另一个会话中终止(它需要 DBA 级别的权限)。

确实,大多数 DBA 宁愿您运行 20 秒的查询,而不是尝试终止运行超过 10 秒的每个查询。除此之外,拥有一个轮询您查询的进程以查看它运行了多长时间是本身就是对数据库资源的浪费。

我建议您与您的 DBA 讨论此问题。您可能会发现自己什么都不担心。

【讨论】:

  • 感谢您的回答。查询已调整。只是任务的性质使它变得困难。事实上,要杀死数据库之外的查询是非常困难的。也许最好看看不同的方法
  • 您可以考虑使用资源管理器在会话超过某个阈值时终止会话 --> asktom.oracle.com/pls/asktom/…
【解决方案2】:

查看 cx_Oracle 7 的 Connection.callTimeout 设置。您需要使用 18 岁以上的 Oracle 客户端库。 (这些将连接到 Oracle DB 11.2+)。 doc for the equivalent node-oracledb parameter 解释了 Oracle 行为和往返行程背后的细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多