2010-07-22 78 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()函数可以枚举这些关闭任何打开的游标。

相关问题