Каковы компромиссы повторного использования курсора против создания нового курсора?

В 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

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

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

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

Независимо от того, что делает ваш код более читаемым и более простым в обслуживании, это то, за что я бы пошел.