重用游标与创建新游标的权衡是什么?
在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()
当然,这两种方法返回的数据是一样的。
这两种方法各有什么优缺点呢?哪种方法效率更高或者更低吗?在多个查询中重复使用一个游标有没有什么潜在的问题呢?
1 个回答
11
你可以随意重复使用一个 cx_Oracle 的游标,这没问题。如果你在短时间内执行成千上万条小查询,重复使用游标可能会稍微提高性能,但我对此持怀疑态度。
有时候我会创建新的游标,有时候则会重复使用已有的游标,这主要取决于哪个方式让代码更容易阅读和理解。
比如说,如果我有很多不同的程序需要访问数据库,我可能会把一个 Oracle 连接对象或者在这个连接上创建的游标传来传去。
总之,选择让你的代码更易读、更易维护的方式才是最重要的。