2010-01-09 26 views
13

Dans cx_Oracle (ou Oracle en général), est-il possible d'allouer un curseur pour chaque requête, ou de réutiliser un curseur sur plusieurs requêtes.Quels sont les compromis entre la réutilisation d'un curseur et la création d'un nouveau curseur?

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 que l'un est particulièrement plus ou moins efficace? Existe-t-il des pièges potentiels pour réutiliser un curseur sur de nombreuses requêtes?

Répondre

9

Vous pouvez réutiliser un curseur cx_Oracle autant que vous le souhaitez, sans problème. Si vous exécutez des milliers de petites requêtes dans un petit laps de temps, pourrait voir une légère amélioration des performances en réutilisant le curseur, mais j'en doute.

Je vais parfois créer de nouveaux curseurs, et d'autres fois en 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. Tout ce qui rend votre code plus lisible et plus facile à entretenir, c'est ce que j'opterais pour.