在关闭数据库连接之前关闭lua脚本中所有打开游标的正确模式是什么?我有一个辅助函数rows()在多个地方调用,它在函数end()上创建游标,我希望能够关闭所有已经创建的游标。
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
答案 0 :(得分:2)
rows()
返回的迭代器函数在结束集结束之前不会关闭游标。也许迭代器的一些实例化并没有完全读出它们的结果。在关闭连接之前,您可以尝试调用collectgarbage('collect')
来清理任何未引用的迭代器函数。 rows()
函数也可以将所有游标放在具有弱引用的表中,end()
函数可以枚举这些游标关闭任何打开的游标。