커서를 재사용하는 것과 새로운 커서 만들기의 상충 관계는 무엇입니까?
문제
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()
물론 두 접근 방식은 동일한 데이터를 반환합니다.
두 접근 방식 사이의 상충 관계는 무엇입니까? 특히 효율적입니까? 많은 쿼리에서 커서를 재사용 할 수있는 잠재적 인 함정이 있습니까?
해결책
CX_ORACLE 커서를 원하는만큼 문제없이 재사용 할 수 있습니다. 작은 시간에 수천 개의 작은 쿼리를 실행하고 있다면 ~할 것 같다 커서를 재사용하여 약간의 성능 향상을 보지만 의심합니다.
나는 때때로 새로운 커서를 만들 것이며, 다른 시간에는 코드를 쉽게 읽고 이해할 수 있는지 여부에 따라 기존 커서를 재사용합니다.
예를 들어, 데이터베이스에 액세스 해야하는 다양한 절차가있는 경우 Oracle Connection 객체를 전달하거나 해당 연결에 생성 된 커서를 전달할 수 있습니다.
코드가 더 읽기 쉽고 유지 관리하기 쉽게 만드는 것은 내가 원하는 것입니다.
제휴하지 않습니다 StackOverflow