Quais são as vantagens e desvantagens de reutilização de um cursor vs. criação de um novo cursor?
Pergunta
Em cx_Oracle (ou Oracle em geral), é possível atribuir um cursor para cada consulta ou reutilizar um cursor em várias consultas.
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()
É claro que ambas as abordagens retornar os mesmos dados.
Quais são as vantagens e desvantagens entre as duas abordagens? É um particular mais ou menos eficiente? Há algum armadilhas potenciais para reutilizar um cursor sobre muitas consultas?
Solução
Você pode re-utilizar um cursor cx_Oracle tanto quanto você gosta, não há problema. Se você está executando milhares de pequenas consultas em um pequeno espaço de tempo, você pode ver uma melhoria de desempenho ligeiro por re-utilizando o cursor, mas eu duvido.
Eu, às vezes, criar novos cursores, e outras vezes re-utilizar um já existente, dependendo se torna o código mais fácil de ler e entender.
Por exemplo, se eu tiver uma variedade de procedimentos que precisam acessar o banco de dados, eu poderia passar um objeto de conexão do Oracle ao redor, ou um cursor criado nessa conexão.
O que faz seu código mais legível e mais fácil de manter é o que eu iria para.