Quels sont les compromis de la réutilisation d'un curseur par rapport à la création d'un nouveau curseur?
Question
Dans cx_Oracle (ou Oracle en général), il est possible d'attribuer un curseur pour chaque requête, ou de réutiliser un curseur sur plusieurs requêtes.
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()
Bien sûr, les deux approches renvoient les mêmes données.
Quels sont les compromis entre les deux approches? Est-ce un particulier plus ou moins efficace? Y a-t-il des pièges potentiels à la réutilisation d'un curseur sur de nombreuses requêtes?
La solution
Vous pouvez réutiliser un curseur de cx_Oracle autant que vous le souhaitez, pas de problème. Si vous exécutiez des milliers de petites requêtes dans un petit espace de temps, vous peut voir une légère amélioration de la performance en réutilisant le curseur, mais je doute.
Je vais parfois créer de nouveaux curseurs, et d'autres fois réutiliser un existant, selon qu'il rend le code plus facile à lire et à comprendre.
Par exemple, si j'ai une variété de procédures qui ont besoin d'accéder à la base de données, je pourrais passer un objet de connexion Oracle autour ou un curseur créé sur cette connexion.
Quelle que soit rend votre code plus lisible et plus facile à maintenir est ce que je vais pour.