2010-07-22 80 views
0

關閉db連接之前關閉lua腳本中所有打開的遊標的正確模式是什麼?我有一個輔助函數rows(),它在多個地方創建了遊標,在函數end()上,我希望能夠關閉所有已創建的遊標。達到如何關閉Lua中所有打開的遊標?

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

數據庫處理不是「本地」Lua的一部分,對吧?如果你正在使用一個庫,也許你應該提及哪一個,因爲不同的可能會有不同的實現和行爲。 – 2010-07-22 11:37:20

+4

注意:end是一個關鍵字,並且不能用作函數的名稱。 – daurnimator 2010-07-22 19:38:30

回答

2

通過rows()返回不關閉遊標,直到結果集的末尾的迭代器功能。也許某些迭代器的實例並沒有完全讀取它們的結果。在關閉連接之前,您可以嘗試調用collectgarbage('collect')以清除任何未引用的迭代器函數。函數rows()也可以將所有遊標放在一個弱引用的表中,並且end()函數可以枚舉這些關閉任何打開的遊標。

相關問題