Каковы преимущества повторного использования курсора и создания нового курсора? - PullRequest
14 голосов
/ 10 января 2010

В cx_Oracle (или Oracle в целом) можно выделить курсор для каждого запроса или повторно использовать курсор для нескольких запросов.

def getSomeData(curs):         # case 1: pass in a cursor, which is generally
    curs.execute('select ...') #         reused across queries
    return curs.fetchall()

def getSomeData(conn):         # case 2: pass in a connection,allocate
    curs=conn.cursor()         #         a cursor for this query
    curs.execute('select ...')
    return curs.fetchall()

Конечно, оба подхода возвращают одни и те же данные.

Каковы компромиссы между двумя подходами?Один из них более или менее эффективен?Есть ли потенциальные ловушки при повторном использовании курсора на многие запросы?

1 Ответ

10 голосов
/ 10 января 2010

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

Иногда я создаю новые курсоры, а иногда повторно использую существующий, в зависимости от того, облегчает ли он чтение и понимание кода.

Например, если у меня есть множество процедур, требующих доступа к базе данных, я могу передать объект соединения Oracle или создать курсор в этом соединении.

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

...