Was sind die Vor- und Nachteile eines Cursors Wiederverwendung gegen einen neuen Cursor erstellen?
Frage
In cx_Oracle (oder Oracle im Allgemeinen) ist es möglich, einen Cursor für jede Abfrage zuweisen oder einen Cursor über mehrere Abfragen wieder zu verwenden.
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()
Natürlich kehren beide Ansätze die gleichen Daten.
Was sind die Vor- und Nachteile zwischen den beiden Ansätzen? Ist ein besonders mehr oder weniger leistungsfähig? Gibt es irgendwelche möglichen Gefahren eines Cursors über viele Anfragen an die Wiederverwendung?
Lösung
Sie können einen cx_Oracle Cursor so viele wiederverwenden, wie Sie mögen, kein Problem. Wenn Sie Tausende von kleinen Anfragen in einem kleinen Raum der Zeit ausgeführt wird, Sie könnte sieht eine leichte Leistungssteigerung durch Wiederverwendung des Cursors, aber ich bezweifle es.
Ich werde manchmal neue Cursor erstellen, und ein anderes Mal wiederverwenden eine vorhandene, je nachdem, ob es der Code leichter zu lesen macht und zu verstehen.
Zum Beispiel, wenn ich eine Vielzahl von Verfahren haben die Notwendigkeit, die Datenbank zuzugreifen, könnte ich eine Oracle-Verbindung Objekt übergeben um, oder einen Cursor auf dieser Verbindung erstellt.
Was macht Ihr Code besser lesbar und leichter zu pflegen ist, was ich für gehen würde.