【发布时间】: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