Код Python для отмены запущенного Oracle SQL Query - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующий код Python, который запускает несколько запросов SQL в базе данных Oracle и объединяет их в один фрейм данных.

Запросы существуют в текстовом файле, и каждая строка представляет собой отдельный запрос SQL. Цикл последовательно выполняет запросы. Я хочу отменить любые запросы SQL, которые выполняются более 10 секунд, чтобы не создавать накладных расходов в базе данных. Следующий код на самом деле не дает результаты, которые я хочу. В частности, этот фрагмент кода действительно помогает мне в моей проблеме:

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

Полный код Python выглядит следующим образом. Вероятно, это функция оракула, которая может быть вызвана для отмены запроса.

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 голосов
/ 16 ноября 2018

Посмотрите на настройку cx_Oracle 7 Connection.callTimeout . Вам нужно будет использовать клиентские библиотеки Oracle 18+. (Они подключатся к БД Oracle 11.2+). Документ для эквивалентного параметра node-oracledb объясняет мелкий шрифт, лежащий в основе поведения Oracle и циклов.

0 голосов
/ 14 ноября 2018

Лучшим подходом было бы потратить некоторое время на настройку запросов, чтобы сделать их настолько эффективными, насколько это необходимо. Как отмечает @Andrew, мы не можем легко убить запрос к базе данных извне базы данных - или даже из другого сеанса внутри базы данных (для этого требуются привилегии уровня DBA).

Действительно, большинство администраторов баз данных предпочли бы, чтобы вы выполняли запрос в течение 20 секунд, а не пытались уничтожить каждый запрос, который выполняется более 10. Помимо всего прочего, наличие процесса, который опрашивает ваш запрос, чтобы увидеть, как долго он выполняется, сама трата ресурсов базы данных.

Я предлагаю вам обсудить это с вашим администратором базы данных. Вы можете обнаружить, что беспокоитесь ни о чем.

...