2010-01-09 6 views
13

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() 

물론 두 접근법 모두 동일한 데이터를 반환합니다.

두 가지 접근 방식 간의 장단점은 무엇입니까? 특히 효율성이 어느 정도입니까? 커서가 여러 쿼리에 재사용 될 수있는 잠재적 인 함정이 있습니까?

답변

9

원하는만큼 cx_Oracle 커서를 재사용 할 수 있습니다. 아무런 문제가 없습니다. 적은 시간에 수천 개의 작은 쿼리를 실행하는 경우 일 수도 있고 일 수도 있습니다. 커서를 다시 사용하여 약간의 성능 향상을 볼 수는 있지만 의심 스럽습니다.

때때로 나는 새로운 커서를 만들고, 다른 시간은 코드를 더 쉽게 읽고 이해할 수 있는지 여부에 따라 기존의 커서를 다시 사용합니다.

예를 들어 데이터베이스에 액세스해야하는 다양한 절차가있는 경우 Oracle 연결 개체를 전달하거나 커서를 해당 연결에 전달할 수 있습니다.

코드를 읽기 쉽고 유지 관리하기 쉽게 만드는 것이 내가 원하는 것입니다.