我有以下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()
答案 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行为和往返行程的详细信息。