Python代码取消正在运行的Oracle SQL查询

时间:2018-11-14 08:48:39

标签: python sql oracle kill cancellation

我有以下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()

2 个答案:

答案 0 :(得分:0)

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

实际上,大多数DBA宁愿您运行查询20秒,而不是尝试杀死每个运行10次以上的查询。除其他以外,有一个查询过程可以查询查询运行了多长时间。本身就是浪费数据库资源。

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

答案 1 :(得分:0)

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