2010-07-22 7 views
0

db 연결을 닫기 전에 루아 스크립트에서 열려있는 모든 커서를 닫는 적절한 패턴은 무엇입니까? Cursor를 생성하는 여러 곳에서 호출되는 도우미 함수 rows()가 있습니다. end() 함수에서 생성 된 모든 함수를 닫을 수 있기를 원합니다. 결과 세트가 끝날 때까지 커서를 닫지 않습니다 rows()에 의해 반환루아에서 열린 커서를 모두 닫으려면 어떻게해야합니까?

function rows (sql_statement) 
    local cursor = assert (con:execute (sql_statement)); 
    local closed = false; 
    return function() 
    if (closed) then return nil end; 
    local row = {}; 
    result = cursor:fetch(row); 
    if (result == nil) then 
     cursor:close(); 
     closed = true; 
     return nil; 
    end; 
    return row; 
    end 
end 

function end() 
    -- this con:close() call fails because of open cursors 
    con:close(); 
    env:close(); 
end 
+2

데이터베이스 처리는 "기본"루아의 일부가 아닙니다. 맞습니까? 라이브러리를 사용하고 있다면 다른 라이브러리가 서로 다른 구현과 동작을 할 수 있으므로 라이브러리 중 하나를 언급해야합니다. –

+4

참고 : end는 키워드이며 함수 이름으로 사용할 수 없습니다. – daurnimator

답변

2

반복자 기능에 도달한다. 아마도 이터레이터의 일부 인스턴스 생성은 결과를 완전히 읽지는 못했을 것입니다. 연결을 닫기 전에 collectgarbage('collect')을 호출하여 참조되지 않은 반복기 함수를 정리해 볼 수 있습니다. rows() 함수는 모든 커서를 약한 참조가있는 테이블에 배치 할 수 있으며 end() 함수는이 닫는 모든 열린 커서를 열거 할 수 있습니다.

관련 문제