Каковы компромиссы повторного использования курсора против создания нового курсора?
В 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 вокруг или создать курсор, созданный в этом соединении.
Независимо от того, что делает ваш код более читаемым и более простым в обслуживании, это то, за что я бы пошел.