如何关闭Lua中所有打开的游标?
问题描述:
关闭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
答
通过rows()
返回不关闭游标,直到结果集的末尾的迭代器功能。也许某些迭代器的实例并没有完全读取它们的结果。在关闭连接之前,您可以尝试调用collectgarbage('collect')
以清除任何未引用的迭代器函数。函数rows()
也可以将所有游标放在一个弱引用的表中,并且end()
函数可以枚举这些关闭任何打开的游标。
数据库处理不是“本地”Lua的一部分,对吧?如果你正在使用一个库,也许你应该提及哪一个,因为不同的可能会有不同的实现和行为。 – 2010-07-22 11:37:20
注意:end是一个关键字,并且不能用作函数的名称。 – daurnimator 2010-07-22 19:38:30