2010-01-09 2 views
13

В 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() 

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

Каковы компромиссы между двумя подходами? Является ли это особенно более или менее эффективным? Существуют ли какие-либо потенциальные проблемы для повторного использования курсора по многим запросам?

ответ

9

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

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

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

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

Смежные вопросы